Skip to content

player: FF/REW tap seeking, opt-in instant D-pad seeking, Previous/Next episode buttons - #1041

Closed
GLinnik21 wants to merge 21 commits into
mainfrom
pr-921-playback-navigation
Closed

GLinnik21 wants to merge 21 commits into
mainfrom
pr-921-playback-navigation

Conversation

@GLinnik21

Copy link
Copy Markdown
Owner

This PR is #921 by @stefan-ovezea, finished on a branch in this repository so it can merge. The work is theirs; the squash credits them as co-author. Their commits are kept unchanged on this branch, followed by two finishing commits and a merge of main.

Behaviour

  • D-pad Left/Right are unchanged by default: reveal → target → OK, as on main.
  • FF/REW tapped: jumps one Skip interval when the key is released, and the controls stay hidden. Quick taps add up from the last target (SeekBurst), so landing on an earlier keyframe doesn't swallow the travel.
  • FF/REW held: the existing shared scrub, confirmed with OK.
  • Instant D-pad seeking (Settings › Video & playback, per profile, Off by default): with the controls hidden, Left/Right jumps right away.
  • Previous/Next sit in the default row as [Previous][Next], a wider gap, then [Subtitles][Audio][More]. They show whenever an episode has a neighbour in its PlayQueue. There is no setting for them.
    • Movies, extras and items with no neighbour leave the pair out, and the other three discs stay where they are today.
    • An unavailable side is dimmed and skipped by focus; entering the row lands on Next.
    • Past 5 s, Previous shows the restart icon and restarts the episode.
  • Queue handoffs (Previous/Next and Up Next) read a window of the existing PlayQueue (GET /playQueues/{id}), so the earlier rows survive moving on.
  • FF/REW reach the dispatcher as Key::Other rather than as arrows. Outside playback they do nothing, as ui::consts documents for transport keys. The trailer already handles them in that form.

Finishing commits on top of #921

  • 4eb388f8 removes the "Previous/Next buttons" setting end to end, as the review asked: the pref, its Settings row, its locale strings, the boot scenario and the docs. It also tidies leftover "legacy"/"modern" naming.
  • Merge of main at db75bbbf: ru: the five keys the catalogue is missing (Play Version, playback speed) #1029 already adds the five Russian keys this branch had added itself, and main's shorter "Скорость" label is kept. The branch's longer string overflowed the More menu's fits-in-every-language tests.
  • 0a6d418d applies behaviour-preserving simplifications and fixes Add FF/REW tap seeking and independent playback navigation options #921's CI failures.
    • Simplifications:
      • deletes the uncalled request_play_up_next and disc_hit_rect;
      • InstantDpadSeeking is now declared the same way as DeckPress;
      • Controls::pair is derived, and non-episodes skip the per-frame queue lookup;
      • one disc-stack builder and one row-index decoder;
      • TransportButton rules out a focused disabled face in one place, at draw time;
      • queue windows are stored without copying.
    • CI fixes:
      • the focus probe prints the episode-pair keys for every occupant of the control row;
      • the per-profile and Settings picker counts now match the merged settings list.

Verification

Run on the committed tree 0a6d418d in a Linux container that runs as root:

  • make lint (clippy) is clean, and make check-nodef and ci/check-module-layers.py pass.

  • make check unit stage, for the crates this PR touches:

    • plx_screens: test result: ok. 1720 passed; 0 failed
    • plx_appkit: test result: ok. 350 passed; 0 failed
    • plx_ui: test result: ok. 1390 passed; 0 failed
  • Every other failure is environmental:

    These tests make files or folders unwritable to force failures, which root bypasses, or depend on network timing here. They don't touch this PR's code. Because the unit stage failed, make check stopped there and its later stages did not run locally; this PR's CI, which does not run as root, covers them.

  • The ARM cross-build and the simulator builds were not run locally; CI runs them.

  • Nothing has been exercised on an LG TV.

Notes


Generated by Claude Code

stefan-ovezea and others added 21 commits October 22, 2026 16:10
Signed-off-by: Stefan Ovezea <sovezea@gmail.com>
…ansport

Signed-off-by: Stefan Ovezea <sovezea@gmail.com>
Signed-off-by: Stefan Ovezea <sovezea@gmail.com>
Signed-off-by: Stefan Ovezea <sovezea@gmail.com>
Signed-off-by: Stefan Ovezea <sovezea@gmail.com>
Signed-off-by: Stefan Ovezea <sovezea@gmail.com>
Signed-off-by: Stefan Ovezea <sovezea@gmail.com>
Signed-off-by: Stefan Ovezea <sovezea@gmail.com>
Signed-off-by: Stefan Ovezea <sovezea@gmail.com>
Signed-off-by: Stefan Ovezea <sovezea@gmail.com>
Signed-off-by: Stefan Ovezea <sovezea@gmail.com>
Signed-off-by: Stefan Ovezea <sovezea@gmail.com>
Signed-off-by: Stefan Ovezea <sovezea@gmail.com>
Signed-off-by: Stefan Ovezea <sovezea@gmail.com>
Signed-off-by: Stefan Ovezea <sovezea@gmail.com>
Signed-off-by: Stefan Ovezea <sovezea@gmail.com>
…acy-playback-controls

Signed-off-by: Stefan Ovezea <sovezea@gmail.com>

# Conflicts:
#	rust-modules/plex/src/plex/timeline.rs
#	rust-modules/screens/src/player/mod.rs
#	rust-modules/screens/src/registry.rs
#	rust-modules/src/app/playback.rs
#	tests/fixtures/replay/1-boot-home-chip-grid/manifest.json
#	tests/fixtures/replay/1-boot-home-chip-grid/rec-0000.jsonl
#	tests/fixtures/replay/12-filmography-detail-return/manifest.json
#	tests/fixtures/replay/12-filmography-detail-return/rec-0000.jsonl
#	tests/fixtures/replay/6-settings-family/manifest.json
#	tests/fixtures/replay/6-settings-family/rec-0000.jsonl
Signed-off-by: Stefan Ovezea <sovezea@gmail.com>
The maintainer review asked for no toggle on the episode buttons, so the
"Previous/Next buttons" preference is removed end to end: the session
field and setting row, the live cell, the Settings picker, its locale
strings in every shard, the boot scenario and the docs. The pair now
shows whenever an episode has a neighbour in its PlayQueue. Instant
D-pad seeking stays as the one opt-in playback option.

Also drops the leftover "legacy"/"modern" wording and the empty
ScrubPress::Row arm.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Xn4z8v7ojwK4Xm9cci5Qon
Behaviour-preserving cleanups from a reuse/simplification/efficiency
review of the branch:
- delete the now-uncalled request_play_up_next and disc_hit_rect; the
  show-title rule lives once in request_play_queue_item
- InstantDpadSeeking is written like DeckPress (LADDER, soft
  deserializer beside its siblings) instead of a one-use macro
- Controls::pair is derived; Controls::now skips the queue lookup and
  the playhead read for non-episodes
- the player row maps its actions straight to overlays; one disc stack
  builder; one row_index decoder; end_jump_gesture/drop_transport_tap
  replace the copied resets
- TransportButton rules out a focused disabled face once, at draw time
- queue_navigation shares current_index and stores fetched windows
  without copying

CI fixes on the tree merged with main: the focus probe prints the
episode-pair keys for every row occupant, and the per-profile and
Settings picker counts match the merged settings list.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Xn4z8v7ojwK4Xm9cci5Qon

Copy link
Copy Markdown
Owner Author

Closing: these same commits were pushed to #921's branch, and #921 was squash-merged as 2d238e7 with @stefan-ovezea credited. This PR is no longer needed.


Generated by Claude Code

@GLinnik21 GLinnik21 closed this Oct 25, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants