- What's next is the server's: state.advance counts down (10 s) when the
media finishes with an Up next item first, holds while its performer or
warm source is gone, and sets queuePlay at its end; cancel is shared, a
seek or swap ends it; the server skips items nobody can put up. Shared
rules in core whats_next.dart; the app's janitor, per-screen countdown
and end-of-episode card are gone.
- The continuation (next Jellyfin episode, next file of a local show
with its gaps) is an auto item under "Continues with", prepared like
Up next's first item.
- Watch tracking by time In (D3): only time played while this viewer is
in counts; away, paused, held, jumps and stalls never do (P7, P9).
WatchTracker + device WatchHistory (files, links); Jellyfin progress
reads the same watch; records are the AniList seam.
- A server restart no longer loses what played: apps hold their media
and one offers it back (swap.restore, first offer wins), Up next is
re-added, the source re-feeds, and the watch carries on.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PlayerControlsModel holds the controls' state and actions once; the
Standard skin (our own, no more media_kit controls or private-state
reach-ins) and Minimal (the former uosc design, made the app's own and
credited) only draw it. One layout spec for both: play first, then
previous/next, volume, time; subtitles, audio, settings, chat,
fullscreen last; everything else in the settings menu. Settings ->
Player -> Controls: time display, size, hide delay, optional buttons.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>