Skip to content

Flow Watch Party

Tobias Vorwachs edited this page Oct 26, 2026 · 1 revision

Part of the Plugin data protocol. Packet: Packet-mumcord-watch.

Flow: watch party

A YouTube watch party in one channel. Every participant plays the video in their own player; only invitations, playback commands and the shared playlist travel as plugin data.

sequenceDiagram
    participant A as Client A (starter)
    participant S as Mumble server
    participant B as Client B (same channel)
    participant C as Client C (enters later)
    A->>S: start (video), paused
    S-->>B: relayed, B sees an invitation
    B->>S: join (after clicking Join)
    S-->>A: relayed
    A->>S: cmd play / pause / seek
    S-->>B: relayed, B plays the same position
    B->>S: pl add (playlist entry)
    S-->>A: relayed (edits bundled, at most 1 per second)
    A->>S: next (from, id, video)
    S-->>B: relayed
    C->>S: enters the channel
    Note over A,C: Exactly one participant answers (host, else lowest session)
    A->>S: state (video, playing, position, members, playlist cursor)
    S-->>C: relayed, C can click Join
Loading

Steps

  1. Start. A sends start with a video id to every Mumcord user in the channel who announced watch-party. The party starts paused. B's client shows an invitation; nobody joins automatically.
  2. Join. B clicks "Join" and sends join. From then on B's commands and playlist edits are accepted, and B accepts those of other members.
  3. Playback. Any member sends cmd with kind play, pause or seek and position_ms. Receivers set their own player to that position.
  4. Playlist. Members add (add), remove (rm) and move (mv) entries with pl. Entries are ordered by sort key k; concurrent moves are settled by the higher Lamport clock c. Edits are collected and sent at most once per second, split into several messages when they would exceed 1000 bytes. The list holds at most 50 entries.
  5. Next video. When a video ends or someone skips, the client sends next with the entry it left (from), the entry it moves to (id), the video, and skip.
  6. Late joiners. When C enters the channel, exactly one participant answers with state: the host while they are in the party, otherwise the participant with the lowest session number. Every client computes the same answerer, so there is one answer, not many. C sees the current video and position and can click "Join".
  7. Leaving. leave, or leaving the channel or server, removes the member. The party ends when nobody is left.

Conflicts and rules

  • If two parties start at the same moment, the one whose starter has the lower session number wins everywhere.
  • Messages from people who are not in the receiver's own channel are ignored; so are commands and edits from people who have not joined.
  • Session lists such as members are checked against the people in the channel; at most 32 participants are tracked.
  • Video ids must be exactly 11 characters of A-Z, a-z, 0-9, - and _.

Limits and errors

Situation Result
Version 1 client Drops pl and next (unknown t) and ignores the new state fields; basic playback still works.
Invalid video id Message dropped.
Playlist already has 50 entries Further adds are ignored.
Removed entry added or moved later Ignored (a removed id stays removed).
Lost message No acknowledgement. A new state from a late joiner or the next command resynchronises.
Sender not in channel / not joined Ignored.

Packets used

Packet-mumcord-watch

Clone this wiki locally