Skip to content

fix: bound transcoded prefetch concurrency - #57

Merged
tcconnally merged 15 commits into
mainfrom
feat/preview-displays
Aug 5, 2026
Merged

fix: bound transcoded prefetch concurrency#57
tcconnally merged 15 commits into
mainfrom
feat/preview-displays

Conversation

@tcconnally

Copy link
Copy Markdown
Owner

Summary

  • Bounds concurrent server-transcode prefetches to the configured media-engine budget.
  • Separates active playback URLs from queued prefetch URLs for accurate accounting.
  • Returns a skipped prefetch item to the playlist instead of dropping it.

Verification

  • Repository suite: all suites green.
  • Reliability tests: 52 passed.
  • Playlist tests: 10 passed.
  • macOS playback contract tests: 3 passed.
  • Python compileall and git diff checks passed.

Soak follow-up

The target macOS/Emby soak must be rerun after pulling this PR. The original report showed an upstream HLS/Emby HTTP-500 burst; this change prevents the client from adding transcoded prefetch load while the server transcode budget is exhausted.

Hermes (Perseus Cloud) added 15 commits July 27, 2026 00:36
Adds a 'Preview' display role alongside the existing 'Wall' role.
Each monitor can be assigned a role in the setup wizard:
- Wall: the public grid (e.g. 2x2 on the external display)
- Preview: a larger operator grid (default 3x4 = 12 cells) on a laptop

Double-clicking any cell in a Preview display fills that laptop screen
with the selected video. Escape (or another double-click) returns to the
preview grid. The wall grid keeps playing independently.

Also persists preview grid size and per-display roles in config.ini.

Version bumped to 10.15.0.
Implements the core changes for preview displays:
- constants.DisplayRole with WALL/PREVIEW values
- HyperwallConfig gains last_preview_rows/cols and last_display_roles
- SetupWizard lets users assign Wall/Preview role per monitor and set preview grid size
- WallController builds wall vs preview windows with different grid sizes
- VideoCell emits request_solo on double-click
- WallController enters/exits solo fullscreen on preview displays; Escape exits solo
- app.py wires new settings through and persists them
- version bumped to 10.15.0
Adds a TCP/JSON sync mesh so multiple Hyperwall instances can cooperate.
- New hyperwall/sync.py: SyncServer + SyncClient, newline-delimited JSON
  protocol with hello/full_state/cell_update/solo/exit_solo/filter/remote_solo.
- Config options: sync_enabled, sync_server, sync_host, sync_port,
  sync_display_name (defaults: off, port 9876).
- WallController gains per-cell and per-display UUIDs, sync adapter hooks,
  and applies remote state changes on the GUI thread.
- Local state changes (next/prev/filter/solo/exit solo) are broadcast to peers.
- Remote solo: Ctrl+double-click a preview cell asks the server to fullscreen
  that item on every other peer's first display.
- App starts server or client based on config and attaches the adapter.
- Adds tests/test_sync.py covering framing, hello, broadcast, filter,
  and remote-solo routing.

All portable tests pass; Qt-dependent tests still run on Windows build job.
Integrates the sync layer added in the previous commit:
- cell.py: request_remote_solo signal + Ctrl+double-click handler.
- wall.py: cell/display UUIDs, sync_broadcast_* helpers, sync_apply,
  _remote_solo, and adapter lifecycle in _cleanup.
- config.py: persists sync_enabled/server/host/port/display_name.
- app.py: starts SyncServer/SyncClient and attaches adapter to controller.
- tests/run_all.py: register test_sync.py suite.
- Add RelayController and run_sync_relay() for running the sync server
  headlessly on a LAN host (no Qt/mpv needed).
- Fix SyncServer._build_full_state to read relay-stored state.
- Add --sync-relay/--sync-host/--sync-port CLI flags to hyperwall.py.
- Add scripts/run-hyperwall-relay.sh for mb.perseus.observer.
- Add scripts/run-hyperwall-client-macos.sh and
  scripts/config.client.ini.template for Mark's macOS client.
- Add RelayController tests. Full suite green.
@tcconnally
tcconnally merged commit 5548683 into main Aug 5, 2026
2 checks passed
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.

1 participant