- 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>
Server and core: version ranges on both sides with a coded refusal; a
client id maps to the same member and token for the server's life; a
drop is `gone` for a 10-minute grace keeping ready, presence, queue
items, relay and avatar; `bye` leaves at once; ordered takeover (seq,
replaced/stale); presence joining/in/away/gone with one PresencePolicy;
joiners never pause playback and hold a held gate at most ~15 s;
state.hold; feed ids, seq and replay; the relay lives through its
source's grace and continues on re-dial; queue `by` lasting, auto
items and cancel; MediaRef carried; client ids never logged.
App: persisted client id and seq; Connection with unstable/lost/
replaced states, backoff with jitter, no lost/back pair per flap; a drop
keeps the session (state, player, media, relay source); presence in the
strip and members card; sit out = away intent; feed matched by id;
auto sit-out (idle when not playing, minimised for a while; never when
alone) replaces auto-unready; bye on close and Leave, not on update
restart; relay source re-dials through its grace.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Tests: the four known failures fixed (test-side causes), one duplicate
file and four detail-pinning cases removed, every test that pins
behaviour the restructure changes tagged with its step.
- Every toast, sound and activity-log line goes through Notifier.notify
(AppEvent), mapped one-to-one to today's behaviour.
- Platform ports (shell, URLs, folders, link resolver, system
notifications) with desktop implementations; window_manager, Process
and file_picker now live only in platform/desktop/.
- ROADMAP: protocol 16 planned; app id dev.foxyz.starsync.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Up next: a server-side queue anyone edits by item id (add at end or
next, move, remove, play now, skip); each item says who added it and
how it plays. At the real end the first item swaps in after the end
card's countdown, put up by whoever can (its adder for through-me links
and files, someone with access for Jellyfin, else anyone); items that
can't play are skipped with the reason. The next item's link is
resolved ahead. Greyed "Continues with" episodes below. A chip with the
controls opens it as a popover (leaf_widgets, local path dependency for
now); "Add to queue" next to Put it up everywhere.
Delivery: the server measures the source's rate, the media's bitrate
and each member's read rate; the members card shows a source line
(who passes it on, through what, keeping up or not, source left) and
each member's route and buffer. A slow source is told once per media.
A failed server fetch is announced to everyone.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>