From 1a658875bc0d7618a1f01c0d682a3d9748340b2f Mon Sep 17 00:00:00 2001 From: christian Date: Tue, 6 Oct 2026 18:11:01 -0400 Subject: [PATCH] Resi cue countdowns on ProPresenter and in Companion The Resi -> ProPresenter bridge, its installer and site kit, and the Companion module resi-studio-cues, as running at North Attleboro. Bridge (resi_to_propresenter.py) - Follows a Resi decoder's playhead and keeps ProPresenter's NextCue timer counting down to the next cue; optional cue name as a stage message, sent once per cue (ProPresenter flashes it on every send) and off by default. - Playhead estimate no longer learns a cadence from the partial first gap after a start, so a 30s Resi doesn't read as paused half the time. - Backs off on 429, holds 2 min before retrying a failed startup login, and logs Resi's actual reason (wrong password, USER_LOCKED, rate limit). - --setup asks for the login, decoder, ProPresenter and timer. install_bridge.sh installs it as a login service (outside ~/Documents, which launchd may not read); make_kit.sh builds the kit for another site. Companion module resi-studio-cues 0.1.4 (source/, package committed) - Same playhead fix; login and request hold-off (15s doubling to 5 min); a 401/403 on a fresh session is a permission, not a reason to sign in again; init never fails on a Resi problem, so Companion can't restart it into a login loop. Tests: test_playhead.py, test_stage_message.py, test_rate_limit.py and source/backoff_test.js run offline; test_end_to_end.py drives a real ProPresenter and refuses to run without an explicit flag. Co-Authored-By: Claude Opus 5.5 --- .gitignore | 12 + README.md | 116 ++++ install_bridge.sh | 108 ++++ make_kit.sh | 19 + resi-studio-cues-0.1.4.tgz | Bin 0 -> 432489 bytes resi_to_propresenter.py | 647 ++++++++++++++++++++++ source/HELP.md | 243 ++++++++ source/backoff_test.js | 158 ++++++ source/check_resolve.py | 116 ++++ source/dist/actions.js | 184 ++++++ source/dist/config.js | 65 +++ source/dist/feedbacks.js | 113 ++++ source/dist/main.js | 1076 ++++++++++++++++++++++++++++++++++++ source/dist/presets.js | 303 ++++++++++ source/dist/upgrades.js | 5 + source/dist/variables.js | 43 ++ source/manifest.json | 35 ++ source/npm_vendor.py | 105 ++++ source/resi_probe.py | 243 ++++++++ source/tick_test.js | 272 +++++++++ test_end_to_end.py | 151 +++++ test_playhead.py | 267 +++++++++ test_rate_limit.py | 105 ++++ test_stage_message.py | 162 ++++++ 24 files changed, 4548 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100755 install_bridge.sh create mode 100755 make_kit.sh create mode 100644 resi-studio-cues-0.1.4.tgz create mode 100644 resi_to_propresenter.py create mode 100644 source/HELP.md create mode 100644 source/backoff_test.js create mode 100644 source/check_resolve.py create mode 100644 source/dist/actions.js create mode 100644 source/dist/config.js create mode 100644 source/dist/feedbacks.js create mode 100644 source/dist/main.js create mode 100644 source/dist/presets.js create mode 100644 source/dist/upgrades.js create mode 100644 source/dist/variables.js create mode 100644 source/manifest.json create mode 100644 source/npm_vendor.py create mode 100644 source/resi_probe.py create mode 100644 source/tick_test.js create mode 100644 test_end_to_end.py create mode 100644 test_playhead.py create mode 100644 test_rate_limit.py create mode 100644 test_stage_message.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d830bfa --- /dev/null +++ b/.gitignore @@ -0,0 +1,12 @@ +# Site settings: `resi_to_propresenter.py --setup` writes this on the Mac that runs +# the bridge. The Resi password is never in it (it lives in that Mac's Keychain). +resi_pp_config.json + +# Built by make_kit.sh +resi-propresenter-kit.zip + +# Superseded Companion module packages, kept locally only +older versions/ + +__pycache__/ +.DS_Store diff --git a/README.md b/README.md new file mode 100644 index 0000000..9b89259 --- /dev/null +++ b/README.md @@ -0,0 +1,116 @@ +# Resi → ProPresenter countdown + +Shows a countdown to the next Resi cue on ProPresenter's stage display, and optionally +the cue's name as a stage message. ProPresenter does the counting, so it's smooth; a small +background service on a Mac keeps it pointed at the right cue. + +``` +Resi (cloud) ──► always-on Mac (this service) ──► ProPresenter (timer, optional stage message) +``` + +It talks to Resi directly. Companion isn't needed for the countdown; the Companion +module in this kit is optional, for buttons and Stream Deck displays. + +## What you need + +- **An always-on Mac** on the same network as ProPresenter, ideally one that logs in + automatically (an ingest or utility Mac). It can be the ProPresenter Mac itself. +- **A Resi login** that can see the campus's decoder. +- **ProPresenter 7.9 or newer.** + +## 1. Set up ProPresenter (once per site) + +1. **Settings → Network**: turn on **Enable Network**. Note the IP address and port. +2. **Timers**: add a **Countdown** timer named **`NextCue`** (any length; it gets overwritten). +3. **Stage layout**: in the layout your stage screen uses, add a **Timer** object set to + **NextCue**. Add a **Stage Message** object only if you'll turn cue-name messages on. + +## 2. Install the service (on the always-on Mac) + +Copy this folder onto that Mac, open **Terminal**, and run: + +```bash +zsh ~/Desktop/resi-propresenter-kit/install_bridge.sh +``` + +(adjust the path to wherever you put the folder). It asks for: + +1. **Resi login email and password.** The password goes in that Mac's Keychain, not a file. +2. **Which decoder** feeds this campus, picked from a numbered list. +3. **ProPresenter's address**, e.g. `192.168.1.50:1025`. It checks it can reach it. +4. **Which timer** to drive (`NextCue`). It checks the timer exists. +5. **Whether to show cue names as a stage message.** Default is **no**: just the countdown. + If yes, the name is sent once per cue (never repeated), so it won't keep flashing. + +Then it starts the service and shows the first lines of its log. You should see +`NextCue -> in 00:12:34`. From then on it starts at login, restarts itself if +it stops, and follows whatever event the decoder is playing. Nobody has to do anything on +service day. + +If the installer warns that the Mac doesn't log in automatically, turn on **System +Settings → Users & Groups → Automatically log in as …** (FileVault must be off). +Otherwise the countdown won't come back after a reboot until someone logs in. + +Run only **one copy per ProPresenter**: two copies fight over the same timer. + +## 3. Optional: Companion module + +In Companion: **Modules → Import module package** → `resi-studio-cues-0.1.2.tgz`, then add a +**Rey Kroona: Resi Studio Cues** connection. It provides variables such as +`next_cue_name`, `next_cue_time_in_hms` and `playback_state` for buttons. + +## Day to day + +| To… | Run (on that Mac) | +|---|---| +| Watch what it's doing | `tail -f ~/Library/Logs/resi-propresenter.log` | +| Change decoder / ProPresenter / password / stage message on-off | `zsh install_bridge.sh --setup` | +| Update to a newer script | run `zsh install_bridge.sh` from the new kit (keeps settings) | +| Remove it | `zsh install_bridge.sh --uninstall` | + +## If something's wrong + +- **`Resi rejected the login`**: the password changed. Run `--setup` again. +- **`Cannot reach ProPresenter`**: ProPresenter is closed, its IP changed, or Network is + off. Run `--setup` to enter the new address. +- **`playback stopped — timer held`**: the decoder isn't moving, or Resi isn't reporting. + It picks back up by itself when playback resumes. +- **Stage shows the cue name but no countdown**: the stage layout's timer object isn't set + to `NextCue`. +- **Over SSH**: the installer asks for that Mac's login password first, to unlock its + Keychain. Remote sessions keep it locked. + +Resi's API is undocumented and unsupported, so don't open a Resi ticket about this tool. + +## Working on it + +| Path | What it is | +|---|---| +| `resi_to_propresenter.py` | The bridge. Python 3, standard library only. | +| `install_bridge.sh` | Installs it as a login service on the Mac it runs on, and runs `--setup` when needed. | +| `make_kit.sh` | Builds `resi-propresenter-kit.zip` for another site (no site settings inside). | +| `source/` | The Companion module `resi-studio-cues` (`dist/` is what ships, plus `manifest.json` and `HELP.md`). | +| `resi-studio-cues-0.1.4.tgz` | The current Companion package: import it in Companion → Modules. | + +Tests. All run offline against fakes, except the end-to-end one: + +```bash +python3 test_playhead.py # the playhead estimator, nine Resi profiles plus slow-start cases +python3 test_stage_message.py # stage message sent once per cue, never when switched off +python3 test_rate_limit.py # backs off when Resi says "too many requests" +node source/backoff_test.js # Companion module: login hold-off, no crash loop on a locked account +``` + +`source/tick_test.js` is the Companion module's estimator test (run with JavaScriptCore's +`jsc`, with `var TARGET='dist/main.js'` loaded first). `test_end_to_end.py` drives a **real** +ProPresenter's `NextCue` timer and stage message, so it refuses to run without +`
--touch-live-propresenter`. Stop the installed bridge before using it. + +The Companion package is `source/dist`, `source/manifest.json` and `source/HELP.md` (under +`companion/`), plus a vendored `node_modules` with `@companion-module/base` 1.14.1 +(`source/npm_vendor.py` assembles one). Bump the version in `manifest.json` and the +package's `package.json` on every change. + +**Running at North Attleboro:** the bridge, Companion and ProdDash all run on the NA Ingest +Mac, and all three use the `media@waters.church` Resi login. Keep them polling no faster than +every 3 seconds: Resi rate-limits the account when tools share it. diff --git a/install_bridge.sh b/install_bridge.sh new file mode 100755 index 0000000..a6fa3dc --- /dev/null +++ b/install_bridge.sh @@ -0,0 +1,108 @@ +#!/bin/zsh +# install_bridge.sh — install the Resi -> ProPresenter bridge as a login service on THIS Mac. +# +# Put this folder on the Mac that should run the bridge (one that stays on and logged in), +# then run: zsh install_bridge.sh +# +# First run asks for the Resi login, the decoder, ProPresenter's address and the timer. +# Safe to run again: it keeps those answers, replaces the script and restarts the service. +# zsh install_bridge.sh --setup ask the questions again +# zsh install_bridge.sh --uninstall stop it and remove it from this Mac +set -e + +HERE="${0:A:h}" +DEST="$HOME/Library/Application Support/resi-propresenter" +LABEL="org.waterschurch.resi-propresenter" +PLIST="$HOME/Library/LaunchAgents/$LABEL.plist" +LOG="$HOME/Library/Logs/resi-propresenter.log" + +if [[ "$1" == "--uninstall" ]]; then + launchctl bootout "gui/$(id -u)/$LABEL" 2>/dev/null || true + rm -f "$PLIST" + echo "Stopped and removed the service. Settings are kept in $DEST (delete it to forget them)." + exit 0 +fi + +# python3 ships with the Command Line Tools; /usr/bin/python3 is only a stub without them +if ! /usr/bin/python3 -c 'import sys' 2>/dev/null; then + echo "python3 isn't usable yet. Run: xcode-select --install then run this again." + exit 1 +fi + +# Outside ~/Documents: macOS blocks background services from reading it. +mkdir -p "$DEST" "$HOME/Library/LaunchAgents" "$HOME/Library/Logs" +if [[ ! "$HERE/resi_to_propresenter.py" -ef "$DEST/resi_to_propresenter.py" ]]; then + cat "$HERE/resi_to_propresenter.py" > "$DEST/resi_to_propresenter.py.new" + mv "$DEST/resi_to_propresenter.py.new" "$DEST/resi_to_propresenter.py" +fi +# A config shipped alongside (re-installing a known site) seeds a fresh install only. +if [[ -f "$HERE/resi_pp_config.json" && ! -f "$DEST/resi_pp_config.json" ]]; then + cp "$HERE/resi_pp_config.json" "$DEST/resi_pp_config.json" +fi + +complete=$(/usr/bin/python3 - "$DEST/resi_pp_config.json" <<'EOF' +import json, subprocess, sys +try: + c = json.load(open(sys.argv[1])) +except Exception: + print("no"); sys.exit() +ok = c.get("resi_user") and c.get("player") and c.get("propresenter") and c.get("timer_name") +ok = ok and subprocess.run(["security", "find-generic-password", "-a", c["resi_user"], + "-s", "resi-propresenter"], capture_output=True).returncode == 0 +print("yes" if ok else "no") +EOF +) + +if [[ "$complete" != "yes" || "$1" == "--setup" ]]; then + # Over SSH the login keychain is locked, and saving the Resi password into it fails + # with "User interaction is not allowed" until it is unlocked here. + if [[ -n "$SSH_CONNECTION" ]]; then + echo "Unlock $(scutil --get ComputerName)'s Keychain: enter the Mac login password for $(whoami)." + security unlock-keychain "$HOME/Library/Keychains/login.keychain-db" + fi + /usr/bin/python3 "$DEST/resi_to_propresenter.py" --setup +fi + +cat > "$PLIST" < + + + + Label + $LABEL + ProgramArguments + + /usr/bin/python3 + $DEST/resi_to_propresenter.py + + RunAtLoad + + + KeepAlive + + ThrottleInterval + 30 + StandardOutPath + $LOG + StandardErrorPath + $LOG + + +EOF + +launchctl bootout "gui/$(id -u)/$LABEL" 2>/dev/null || true +launchctl bootstrap "gui/$(id -u)" "$PLIST" +echo "Installed. Waiting for the first lines of the log..." +sleep 10 +tail -n 8 "$LOG" +echo +echo "Running on $(scutil --get ComputerName). Log: $LOG" + +# After a reboot the service only starts once someone is logged in. +autologin=$(defaults read /Library/Preferences/com.apple.loginwindow autoLoginUser 2>/dev/null || true) +if [[ "$autologin" != "$(whoami)" ]]; then + echo + echo "NOTE: this Mac doesn't log in to '$(whoami)' automatically, so after a reboot the" + echo "countdown won't start until someone logs in. To make it fully hands-off, turn on" + echo "System Settings -> Users & Groups -> Automatically log in as $(whoami) (needs FileVault off)." +fi diff --git a/make_kit.sh b/make_kit.sh new file mode 100755 index 0000000..7a41d5c --- /dev/null +++ b/make_kit.sh @@ -0,0 +1,19 @@ +#!/bin/zsh +# make_kit.sh — bundle everything another site needs into resi-propresenter-kit.zip. +# Site settings (resi_pp_config.json) are left out on purpose: the installer asks. +set -e +HERE="${0:A:h}" +cd "$HERE" +MODULE=$(ls resi-studio-cues-*.tgz | sort -V | tail -1) + +STAGE=$(mktemp -d) +KIT="$STAGE/resi-propresenter-kit" +mkdir "$KIT" +cp install_bridge.sh resi_to_propresenter.py README.md "$MODULE" "$KIT/" +chmod +x "$KIT/install_bridge.sh" + +rm -f resi-propresenter-kit.zip +(cd "$STAGE" && COPYFILE_DISABLE=1 zip -qrX "$HERE/resi-propresenter-kit.zip" resi-propresenter-kit) +rm -rf "$STAGE" +echo "Built resi-propresenter-kit.zip:" +unzip -l resi-propresenter-kit.zip | sed -n '4,$p' | sed '$d' | sed '$d' diff --git a/resi-studio-cues-0.1.4.tgz b/resi-studio-cues-0.1.4.tgz new file mode 100644 index 0000000000000000000000000000000000000000..3560714025ec9600a0bef92867d26e8268e066ae GIT binary patch literal 432489 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∈K&W=O+fl(l)8zkJcz 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

5T$6j9lg|NOwMRobi%!@{LmN0Ma`N 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

!GMaM;;Q4RZd%3aw(HABpIs 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 literal 0 HcmV?d00001 diff --git a/resi_to_propresenter.py b/resi_to_propresenter.py new file mode 100644 index 0000000..e7a9b7d --- /dev/null +++ b/resi_to_propresenter.py @@ -0,0 +1,647 @@ +#!/usr/bin/env python3 +""" +resi_to_propresenter.py — drive a ProPresenter countdown timer from Resi cue points. + +Watches a Resi decoder's playhead, works out how long until its next cue, and keeps a +ProPresenter timer armed with that number. ProPresenter renders the countdown itself, so +the stage screen is smooth and styled; this only pokes it when something actually changes. + +No Companion, no Stream Deck. Python 3 only — nothing to install. + + python3 resi_to_propresenter.py --setup # pick the decoder, ProPresenter and timer + python3 resi_to_propresenter.py # run it + python3 resi_to_propresenter.py --dry-run # watch what it WOULD send + python3 resi_to_propresenter.py --list # show venues/decoders + +The Resi password is read from the macOS Keychain, never stored here; --setup saves it +(Keychain service "resi-propresenter", account = resi_user from the config). + +Resi's API is undocumented and unsupported; don't open a Resi ticket about it. +""" + +import argparse +import http.cookiejar +import json +import math +import os +import subprocess +import sys +import time +import urllib.error +import urllib.parse +import urllib.request + +HERE = os.path.dirname(os.path.abspath(__file__)) +CONFIG_PATH = os.path.join(HERE, "resi_pp_config.json") +RESI = "https://central.resi.io" +KEYCHAIN_SERVICE = "resi-propresenter" + +DEFAULTS = { + "resi_user": "", + "player": "", # playerHardwareId; blank = use the only one found + "propresenter": "", # e.g. http://192.168.1.50:1025 -- set by --setup + "timer_name": "NextCue", + "stage_message": False, # also show the next cue's NAME as a ProPresenter stage message + "poll_seconds": 3.0, # how often to ask Resi where the playhead is. Resi only + # republishes every ~5-30s, and the estimate fills the gaps; + # 1s polling from two tools on one account hit its rate limit. + "cue_refresh_seconds": 5, # how often to re-read the cue list + "resync_seconds": 30, # re-push to ProPresenter even when nothing changed + "position_trim_ms": 0, # only if the whole chain reads consistently behind +} + + +# --------------------------------------------------------------------------- utilities +def now_ms(): + """Wall clock in milliseconds. A seam so the estimator can be tested on a fake clock.""" + return time.time() * 1000 + + +def log(msg): + print("%s %s" % (time.strftime("%H:%M:%S"), msg), flush=True) + + +def hms(ms): + s = max(0, int(ms // 1000)) + return "%02d:%02d:%02d" % (s // 3600, (s % 3600) // 60, s % 60) + + +def position_to_ms(pos): + """'01:02:03.500' -> milliseconds, or None.""" + try: + hh, mm, rest = pos.split(":") + return int((int(hh) * 3600 + int(mm) * 60 + float(rest)) * 1000) + except (ValueError, AttributeError): + return None + + +def keychain_password(account): + try: + out = subprocess.run( + ["security", "find-generic-password", "-a", account, "-s", KEYCHAIN_SERVICE, "-w"], + capture_output=True, text=True, timeout=10) + except (OSError, subprocess.SubprocessError) as e: + raise SystemExit("Could not run the Keychain helper: %s" % e) + if out.returncode != 0: + raise SystemExit( + "No Resi password in the Keychain for '%s'.\nAdd it once with:\n" + ' security add-generic-password -a "%s" -s %s -w' + % (account, account, KEYCHAIN_SERVICE)) + return out.stdout.rstrip("\n") + + +# ------------------------------------------------------------------------------- Resi +class Resi: + def __init__(self, username, password): + self.username, self.password = username, password + self.jar = http.cookiejar.CookieJar() + self.opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(self.jar)) + self.token = None + self.logged_in_at = 0 + self.customer_id = None + self.no_cache_bust = False + + def _cookie(self, name): + for c in self.jar: + if c.name == name: + return c.value + return None + + def _call(self, method, path, body=None): + url = RESI + path + headers = {"Accept": "application/json", "User-Agent": "resi-to-propresenter/1.0"} + if self.token: + headers["Authorization"] = "X-Bearer " + self.token + data = None + if body is not None: + data = json.dumps(body).encode() + headers["Content-Type"] = "application/json" + req = urllib.request.Request(url, data=data, headers=headers, method=method) + with self.opener.open(req, timeout=20) as resp: + raw = resp.read() + return json.loads(raw) if raw else None + + def login(self): + try: + self._call("POST", "/api/v3/login?newToken=true", + {"userName": self.username, "password": self.password}) + except urllib.error.HTTPError as e: + body = e.read() + if b"INVALID_CREDENTIALS" in body: + raise SystemExit( + "Resi rejected the login for '%s' (wrong password?).\nReplace it with:\n" + ' security add-generic-password -U -a "%s" -s %s -w' + % (self.username, self.username, KEYCHAIN_SERVICE)) + if b"USER_LOCKED" in body: + raise SystemExit("Resi has locked the account '%s' (USER_LOCKED) — unlock it " + "at studio.resi.io or with a Resi admin" % self.username) + # The body was read above, so say what it was here: it is the only clue. + raise RuntimeError("HTTP %s %s" % (e.code, body[:200].decode("utf-8", "replace"))) + self.token = self._cookie("livingas1") + if not self.token: + raise RuntimeError("login succeeded but returned no session cookie") + self.logged_in_at = time.time() + me = self._call("GET", "/api_v2.svc/users/me") + self.customer_id = me.get("customerId") + if not self.customer_id: + raise RuntimeError("this Resi account has no customerId") + log("Resi: signed in as %s (%s)" % (me.get("userName"), me.get("customerName"))) + + def ensure_session(self): + if not self.token or time.time() - self.logged_in_at > 50 * 60: + self.login() + + def get(self, path): + self.ensure_session() + try: + return self._call("GET", path) + except urllib.error.HTTPError as e: + if e.code in (401, 403): + log("Resi: session expired, signing in again") + self.login() + return self._call("GET", path) + raise + + def venues(self): + return self.get("/api/v3/customers/%s/venues" % self.customer_id) or [] + + def players(self, venue_uuid): + path = "/api_v2.svc/users/%s/players" % venue_uuid + if not self.no_cache_bust: + try: + return self.get(path + "?_=%d" % int(time.time() * 1000)) or [] + except urllib.error.HTTPError as e: + # 429 is Resi saying "slow down", not an objection to the parameter; + # dropping it on a 429 lost the fresh readings for good. + if 400 <= e.code < 500 and e.code != 429: + self.no_cache_bust = True + log("Resi: dropping the cache-busting parameter (%s)" % e.code) + else: + raise + return self.get(path) or [] + + def event(self, event_id): + return self.get("/api/v3/customers/%s/events/%s" % (self.customer_id, event_id)) + + def cues(self, profile_id, event_id): + raw = self.get("/api_v2.svc/streamprofiles/%s/events/%s/cues?canISetCues=1" + % (profile_id, event_id)) or [] + out = [] + for c in raw: + ms = position_to_ms(c.get("position")) + if ms is not None: + out.append({"name": c.get("name") or "", "ms": ms}) + out.sort(key=lambda c: c["ms"]) + return out + + +# -------------------------------------------------------------------------- estimator +class Playhead: + """Resi republishes `position` only every few seconds, irregularly, and each reading + is already slightly stale. Every reading is kept as media-time-minus-wall-time; the + LARGEST recent value is the least-delayed reading and is the one trusted. The + estimate is then just "now plus that offset", correct to within Resi's own pipeline + lag and smooth between updates.""" + + WINDOW_MS = 120_000 + + def __init__(self, trim_ms=0): + self.trim_ms = trim_ms + self.offsets = [] # (arrival_ms, offset_ms) + self.spreads = [] # how far honest readings sit apart: this link's noise + self.gaps = [] # how often the playhead actually moves + self.changes = 0 # readings that differed from the one before + self.rejected = False # the last gap looked like a pause and was skipped + self.base = None + self.last_media = None + self.last_new_at = None + self.last_est = None + self.seeked = False + + def note(self, media_ms): + now = now_ms() + if media_ms != self.last_media: + off = media_ms - now + noise = max(self.spreads) if self.spreads else 0 + threshold = max(5000, noise * 1.5 + 4000) + if self.base is not None: + delta = off - self.base + if abs(delta) > threshold: + # seek, fired cue, or resume after a pause: the window describes + # the old position and has to go + self.offsets = [] + self.seeked = True + if abs(delta) > 10000: + self.last_est = None + elif delta < 0: + self.spreads = (self.spreads + [-delta])[-20:] + # The first reading lands at an arbitrary point in Resi's cycle, so the gap + # from it to the next one is only a fraction of the real cadence. Learning + # from it locked in a 2s cadence that rejected every honest 30s gap. + if self.last_new_at is not None and self.changes > 0: + gap = now - self.last_new_at + # The gap either side of a pause is not Resi's cadence -- recording it + # would inflate the estimate and make the NEXT pause slow to notice. + # But a pause is one gap; twice in a row is the cadence having changed. + if 0 < gap < 60000: + if not self.gaps or gap <= 3 * max(self.gaps) or self.rejected: + self.gaps = (self.gaps + [gap])[-8:] + self.rejected = False + else: + self.rejected = True + if self.last_new_at is not None: + self.changes += 1 + self.offsets.append((now, off)) + self.last_media = media_ms + self.last_new_at = now + kept = [o for o in self.offsets if now - o[0] <= self.WINDOW_MS] + # Always keep the newest reading even once it is older than the window. If the + # window empties during a long pause there is no offset left to compare against, + # so the resume looks like an ordinary reading instead of a discontinuity. + if not kept and self.offsets: + kept = [self.offsets[-1]] + self.offsets = kept + self.base = max(o[1] for o in self.offsets) if self.offsets else None + + def read(self): + """-> (estimated_media_ms, playing, cadence_ms) or (None, False, 0).""" + if self.last_new_at is None: + return None, False, 0 + now = now_ms() + cadence = max(self.gaps) if self.gaps else 0 + # Only call it paused once the playhead has been still for clearly longer than + # Resi's own reporting cadence -- a fixed timeout mistakes a slow update for a stop. + # Until a full gap has been measured, the cadence is unknown; assume the slowest + # Resi plausibly is, or a 30s publisher looks paused 15s after every startup. + pause_after = max(15000, min(45000, cadence * 2.5 + 6000)) if cadence else 45000 + playing = self.base is not None and (now - self.last_new_at) < pause_after + if not playing: + return (self.last_est if self.last_est is not None else self.last_media), False, cadence + est = now + self.base + self.trim_ms + if self.last_est is not None and est < self.last_est: + est = self.last_est # the window is a max; never run backwards + self.last_est = est + return est, True, cadence + + def take_seek(self): + was, self.seeked = self.seeked, False + return was + + +# ------------------------------------------------------------------- ProPresenter side +_UNKNOWN = object() + + +class ProPresenter: + def __init__(self, base, timer_name, dry_run=False): + self.base = base.rstrip("/") + self.timer = timer_name + self.dry_run = dry_run + self.quoted = urllib.parse.quote(timer_name, safe="") + # text last put on the stage; None = cleared. Unknown at startup, so the first + # message or clear always goes through (a restart may have left one up). + self.sent_message = _UNKNOWN + + def _call(self, method, path, body=None): + if self.dry_run: + log(" would %s %s %s" % (method, path, json.dumps(body) if body is not None else "")) + return True + url = self.base + path + data = None + headers = {} + if body is not None: + data = json.dumps(body).encode() + headers["Content-Type"] = "application/json" + req = urllib.request.Request(url, data=data, headers=headers, method=method) + try: + with urllib.request.urlopen(req, timeout=8): + return True + except urllib.error.HTTPError as e: + log("ProPresenter %s %s -> HTTP %s" % (method, path, e.code)) + except urllib.error.URLError as e: + log("ProPresenter unreachable at %s (%s)" % (self.base, e.reason)) + return False + + def arm(self, seconds): + return self._call("PUT", "/v1/timer/%s/start" % self.quoted, { + "id": {"name": self.timer}, + "allows_overrun": False, + "countdown": {"duration": int(seconds)}, + }) + + def stop(self): + return self._call("GET", "/v1/timer/%s/stop" % self.quoted) + + # ProPresenter re-shows (and flashes) the stage message on every PUT, even with the + # same text, so it is only ever sent when the text actually changes -- never on the + # timer's periodic resync or a pause/resume. + def message(self, text): + if text == self.sent_message: + return True + ok = self._call("PUT", "/v1/stage/message", text) + if ok: + self.sent_message = text + return ok + + def clear_message(self): + if self.sent_message is None: + return True + ok = self._call("DELETE", "/v1/stage/message") + if ok: + self.sent_message = None + return ok + + def check(self): + try: + with urllib.request.urlopen(self.base + "/v1/timers", timeout=8) as r: + timers = json.loads(r.read()) + except Exception as e: + raise SystemExit("Cannot reach ProPresenter at %s (%s).\n" + "Check the address and that its API is enabled in Settings -> Network." + % (self.base, e)) + names = [t.get("id", {}).get("name") for t in timers] + if self.timer not in names: + raise SystemExit("ProPresenter has no timer called '%s'. It has: %s\n" + "Create a countdown timer with that exact name, or set " + "\"timer_name\" in the config." % (self.timer, ", ".join(map(str, names)))) + log("ProPresenter: found timer '%s'" % self.timer) + + +# ------------------------------------------------------------------------------- glue +def load_config(): + cfg = dict(DEFAULTS) + if os.path.exists(CONFIG_PATH): + with open(CONFIG_PATH) as fh: + cfg.update(json.load(fh)) + else: + with open(CONFIG_PATH, "w") as fh: + json.dump(cfg, fh, indent=2) + print("Wrote a starter config to %s — run with --setup to fill it in." % CONFIG_PATH) + raise SystemExit(0) + if not cfg["resi_user"] or not cfg["propresenter"]: + raise SystemExit("%s is incomplete — run with --setup first." % CONFIG_PATH) + return cfg + + +def find_player(resi, wanted): + """-> (venue_uuid, player) for the configured decoder.""" + found = [] + for v in resi.venues(): + for p in resi.players(v.get("uuid")): + found.append((v, p)) + if not found: + raise SystemExit("Resi returned no decoders for this account.") + if wanted: + for v, p in found: + if p.get("playerHardwareId") == wanted: + return v.get("uuid"), p + raise SystemExit("No decoder with playerHardwareId '%s'. Run --list to see them." % wanted) + if len(found) == 1: + v, p = found[0] + return v.get("uuid"), p + raise SystemExit("This account has %d decoders — run --list and set \"player\" in the config." + % len(found)) + + +def do_list(resi): + for v in resi.venues(): + print("\n%s" % (v.get("userName") or v.get("name"))) + players = resi.players(v.get("uuid")) + if not players: + print(" (no decoders)") + for p in players: + print(" %-30s playerHardwareId: %s" % (p.get("userName"), p.get("playerHardwareId"))) + print(" %-30s position: %s eventId: %s" + % ("", p.get("position"), p.get("eventId"))) + print("\nPut the playerHardwareId you want into \"player\" in %s" % CONFIG_PATH) + + +STARTUP_LOGIN_HOLD_S = 120 + + +def run(cfg, dry_run): + resi = Resi(cfg["resi_user"], keychain_password(cfg["resi_user"])) + try: + resi.login() + except (Exception, SystemExit) as e: + # launchd restarts the service 30s after it exits, so failing straight away + # here meant a login attempt every 30s -- enough, with a wrong password or a + # rate limit, to get the Resi account locked. Hold first. + log("Resi login failed (%s) — waiting %ds before trying again" + % (e, STARTUP_LOGIN_HOLD_S)) + time.sleep(STARTUP_LOGIN_HOLD_S) + raise SystemExit(1) + pp = ProPresenter(cfg["propresenter"], cfg["timer_name"], dry_run) + if not dry_run: + pp.check() + + venue_uuid, player = find_player(resi, cfg["player"]) + hardware_id = player.get("playerHardwareId") + log("Watching decoder '%s' (%s)" % (player.get("userName"), hardware_id)) + + head = Playhead(cfg["position_trim_ms"]) + cues, event_id, profile_id = [], None, None + last_cue_load = 0.0 + last_push = 0.0 + pushed_cue = None # (name, ms) currently armed in ProPresenter + pushed_playing = None + backoff = 0 # seconds waited after the last 429; 0 once Resi answers again + + while True: + loop_started = time.time() + try: + players = resi.players(venue_uuid) + me = next((p for p in players if p.get("playerHardwareId") == hardware_id), None) + if me is None: + log("decoder not in the players list right now") + else: + media = position_to_ms(me.get("position")) + if media is not None: + head.note(media) + + # follow the event the decoder is actually on + if me.get("eventId") and me.get("eventId") != event_id: + event_id = me.get("eventId") + ev = resi.event(event_id) or {} + profile_id = ev.get("eventProfileId") + cues = resi.cues(profile_id, event_id) if profile_id else [] + last_cue_load = time.time() + log("event %s — %d cue(s): %s" + % (ev.get("name") or event_id, len(cues), + ", ".join(c["name"] for c in cues) or "none")) + elif not me.get("eventId"): + event_id, cues = None, [] + + seeked = head.take_seek() + if profile_id and event_id and ( + seeked or time.time() - last_cue_load >= cfg["cue_refresh_seconds"]): + fresh = resi.cues(profile_id, event_id) + last_cue_load = time.time() + if fresh != cues: + log("cue list changed — %d cue(s)" % len(fresh)) + cues = fresh + + est, playing, cadence = head.read() + nxt = next((c for c in cues if c["ms"] > est), None) if est is not None else None + + identity = (nxt["name"], nxt["ms"]) if nxt else None + due = (identity != pushed_cue + or playing != pushed_playing + or seeked + or time.time() - last_push >= cfg["resync_seconds"]) + + if due: + if playing and nxt: + remaining = max(0, (nxt["ms"] - est) / 1000.0) + pp.arm(math.ceil(remaining)) + if cfg["stage_message"]: + pp.message(nxt["name"]) + log("%s -> %s in %s (playhead %s, Resi updates every %ss)" + % (cfg["timer_name"], nxt["name"], hms(nxt["ms"] - est), + hms(est), round(cadence / 1000) if cadence else "?")) + elif not playing: + pp.stop() + log("playback stopped — timer held") + else: + pp.stop() + if cfg["stage_message"]: + pp.clear_message() + log("no cues left on this event") + pushed_cue, pushed_playing, last_push = identity, playing, time.time() + + backoff = 0 + except urllib.error.HTTPError as e: + if e.code != 429: + log("Resi: HTTP %s" % e.code) + else: + # Rate-limited. Asking again every poll is what keeps Resi refusing, + # so wait -- 15s doubling to 2min, or as long as Resi asks -- and say + # so once rather than logging a line a second. + try: + asked = int(e.headers.get("Retry-After") or 0) if e.headers else 0 + except ValueError: # an HTTP date instead of seconds + asked = 0 + backoff = min(120, max(15, backoff * 2, asked)) + log("Resi: too many requests — waiting %ds before asking again" % backoff) + time.sleep(backoff) + except urllib.error.URLError as e: + log("network: %s" % e.reason) + except Exception as e: # keep running through a bad service day + log("error: %s" % e) + + time.sleep(max(0.2, cfg["poll_seconds"] - (time.time() - loop_started))) + + +def ask(prompt, default=""): + got = input("%s%s: " % (prompt, " [%s]" % default if default else "")).strip() + return got or default + + +def setup(): + """Interactive first-run: everything site-specific, asked once, written to the config.""" + cfg = dict(DEFAULTS) + if os.path.exists(CONFIG_PATH): + with open(CONFIG_PATH) as fh: + cfg.update(json.load(fh)) + + print("\n-- Resi --") + cfg["resi_user"] = ask("Resi login email", cfg["resi_user"]) + while True: + have = subprocess.run(["security", "find-generic-password", "-a", cfg["resi_user"], + "-s", KEYCHAIN_SERVICE], capture_output=True).returncode == 0 + if not have: + print("Resi password for %s (saved in this Mac's Keychain; nothing shows as you type):" + % cfg["resi_user"]) + if subprocess.run(["security", "add-generic-password", "-U", "-a", cfg["resi_user"], + "-s", KEYCHAIN_SERVICE, "-w"]).returncode != 0: + raise SystemExit("Could not save the password to the Keychain.") + try: + resi = Resi(cfg["resi_user"], keychain_password(cfg["resi_user"])) + resi.login() + break + except SystemExit as e: + if "rejected" not in str(e): + raise + print("Resi rejected that password — try again.") + subprocess.run(["security", "delete-generic-password", "-a", cfg["resi_user"], + "-s", KEYCHAIN_SERVICE], capture_output=True) + + found = [] + for v in resi.venues(): + for p in resi.players(v.get("uuid")): + found.append(p) + if not found: + raise SystemExit("This Resi account has no decoders.") + print("\nDecoders on this account:") + for i, p in enumerate(found, 1): + print(" %d) %-28s now at %s" % (i, p.get("userName"), p.get("position"))) + current = next((i for i, p in enumerate(found, 1) + if p.get("playerHardwareId") == cfg["player"]), 1) + while True: + pick = ask("Which decoder feeds this campus", str(current)) + if pick.isdigit() and 1 <= int(pick) <= len(found): + break + cfg["player"] = found[int(pick) - 1].get("playerHardwareId") + + print("\n-- ProPresenter --") + print("Needs Settings -> Network -> Enable Network turned on; the port is shown there.") + while True: + addr = ask("ProPresenter address (IP:port)", cfg["propresenter"].replace("http://", "")) + base = addr if addr.startswith("http") else "http://" + addr + try: + with urllib.request.urlopen(base.rstrip("/") + "/v1/timers", timeout=8) as r: + names = [t.get("id", {}).get("name") for t in json.loads(r.read())] + break + except Exception as e: + print("Can't reach ProPresenter at %s (%s)." % (base, e)) + cfg["propresenter"] = base.rstrip("/") + print("Timers in ProPresenter: %s" % ", ".join(map(str, names))) + while True: + cfg["timer_name"] = ask("Timer to drive", cfg["timer_name"]) + if cfg["timer_name"] in names: + break + input("No timer called '%s'. In ProPresenter, add a Countdown timer with exactly that " + "name, then press Return. " % cfg["timer_name"]) + with urllib.request.urlopen(cfg["propresenter"] + "/v1/timers", timeout=8) as r: + names = [t.get("id", {}).get("name") for t in json.loads(r.read())] + + print("\nThe countdown always runs. Optionally the next cue's name can also go up as a") + print("ProPresenter stage message (shows wherever a stage layout has a Stage Message box).") + while True: + yn = ask("Show cue names as a stage message? (y/n)", "y" if cfg["stage_message"] else "n") + if yn.lower() in ("y", "yes", "n", "no"): + break + cfg["stage_message"] = yn.lower().startswith("y") + + with open(CONFIG_PATH, "w") as fh: + json.dump(cfg, fh, indent=2) + print("\nSaved %s" % CONFIG_PATH) + + +def main(): + ap = argparse.ArgumentParser(description="Drive a ProPresenter timer from Resi cue points.") + ap.add_argument("--list", action="store_true", help="list venues and decoders, then exit") + ap.add_argument("--dry-run", action="store_true", help="print what would be sent, touch nothing") + ap.add_argument("--setup", action="store_true", help="ask for this site's settings and save them") + args = ap.parse_args() + + if args.setup: + try: + setup() + except (KeyboardInterrupt, EOFError): + raise SystemExit("\nsetup cancelled") + return + cfg = load_config() + if args.list: + resi = Resi(cfg["resi_user"], keychain_password(cfg["resi_user"])) + resi.login() + do_list(resi) + return + try: + run(cfg, args.dry_run) + except KeyboardInterrupt: + print("\nstopped") + + +if __name__ == "__main__": + main() diff --git a/source/HELP.md b/source/HELP.md new file mode 100644 index 0000000..e76cd3e --- /dev/null +++ b/source/HELP.md @@ -0,0 +1,243 @@ +# Resi Studio Cues (Bitfocus Companion Module) + +This module logs into **studio.resi.io / central.resi.io** with a username + password, reads decoder/player playback position, loads cue points for the current event, and exposes variables/actions for cue timing and cue management. + +The main goal is to drive things like a **countdown clock in ProPresenter** (time until next cue, next cue name, etc). + +--- + +## Features + +### Authentication +- Logs in via `POST /api/v3/login?newToken=true` +- Stores auth cookies (`refreshToken`, `livingas1`) and uses them on subsequent requests +- Exposes status via: + - Instance status (green/red in Companion) + - Variables: `auth_status`, `last_error` + +### Player polling (live) +- Polls decoder/player position from: + - `GET /api_v2.svc/users/{venueUuid}/players` +- Updates variables like: + - `current_position` + - `current_position_sec` + - `current_event_id` + +### Cue loading (per event) +When the current `eventId` changes, the module loads: +- Event detail: + - `GET /api/v3/customers/{customerId}/events/{eventId}` + - Captures `startTime` for ToD (time-of-day) math +- Cues: + - `GET /api_v2.svc/streamprofiles/{eventProfileId}/events/{eventId}/cues?canISetCues=1` + +Cues are stored locally and used to compute **next/prev** cue timing from the live playback position. + +### Cue timing variables +- Next cue: + - `next_cue_name` + - `next_cue_time_in_seconds` + - `next_cue_time_in_hms` + - `next_cue_position` + - `next_cue_tod` (24-hour) +- Previous cue: + - `prev_cue_name` + - `prev_cue_time_ago_in_seconds` + - `prev_cue_time_ago_in_hms` + - `prev_cue_position` + - `prev_cue_tod` (24-hour) + +### Cue management actions +- Add cue (player position or custom time) +- Lookup cue by name (stores into `lookup_*` variables) +- Delete cue by name (looks up UUID, deletes by UUID) + +--- + +## Installation / Testing + +### Best (recommended): Developer Module via Git +1. Push this repo to GitHub/GitLab (public or private). +2. On the test system, add it as a Developer Module in Companion. +3. Restart Companion. + +### Offline / manual +1. `yarn install` +2. `yarn build` +3. Zip the module folder (without `node_modules`) and provide to tester. +4. Tester places it in Companion’s modules folder and restarts Companion. + +(Exact folder paths vary by OS / Companion version.) + +--- + +## Configuration + +Typical config fields: +- **Username / Email** +- **Password** (secret) +- **Default Player** (optional) +- **Polling intervals** + - Playback position refresh (fast, e.g. 2000ms) + - Account/venue refresh (slow, e.g. 60000ms) + - Cue refresh while playing (optional, e.g. 15000ms) +- **Fallback when no next cue** (optional) + +> Note: dynamic "read-only" status display inside config is not supported by Companion config fields. +> Use Instance Status + module variables for connection state. + +--- + +## Actions + +- **Refresh profile**: Reload `/users/me` +- **Refresh lists**: Reload venues + players list +- **Select decoder/player**: Choose which player to poll +- **Add cue at player position (or custom time)** + - Options: + - Cue name + - Private cue + - Position source: player vs custom + - Custom time string + - Text fields support Companion variables (e.g. `$(internal:...)`) +- **Lookup cue by name** + - Writes result into: + - `lookup_cue_found`, `lookup_cue_uuid`, `lookup_cue_position`, etc. +- **Delete cue by name** + - Finds matching cue(s), deletes by UUID via: + - `DELETE /.../cues/{uuid}` + +--- + +## Feedbacks (for button coloring) + +Recommended “production” feedback set: +1. **Connected (auth OK)** → Green +2. **Error (auth/API)** → Red +3. **Player active** (position > 0) → Blue +4. **Approaching next cue** (threshold seconds) → Yellow +5. **Playback frozen** (position not changing) → Red + +Playback frozen requires: +- variable `playback_last_change_epoch_ms` to be updated when playback position changes. + +--- + +## Presets Included + +### Status +- Connected / Error indicator +- Player active indicator +- Playback frozen warning + +### Cues +- Next cue display (with T- countdown) +- Previous cue display + +### Maintenance +- Refresh profile +- Refresh venues/players list + +### Cue actions +- Add cue @ player position +- Add cue @ custom time +- Lookup cue by name +- Delete cue by name + +--- + +## Notes / Limitations + +- The Resi API endpoints used here are not public/stable; breaking changes may occur. +- Avoid polling cues every 2 seconds. Recommended cue refresh while playing is 10–30 seconds unless you have a specific need. +- Companion config fields are not truly read-only, so status is exposed via variables + instance status. + +--- + +## Roadmap Ideas + +- Optional periodic cue refresh while playing (rate-limited) +- Extra feedback: "No player selected" +- Extra feedback: "No next cue" +- More presets for ProPresenter integration workflows + +--- + +## Playhead accuracy (0.1.0) + +Resi only republishes a decoder's `position` every few seconds, on an irregular +cadence, and each reading is already slightly stale when it appears. Showing that +number raw makes the countdown jump in steps and sit several seconds behind. + +This build instead keeps a running estimate: + +- every reading is stored as **media time minus wall time**; the largest recent value + is the least-delayed reading and is the one trusted, so a slow round trip or an + unlucky poll can no longer drag the countdown backwards +- the display is recomputed **every second** from that offset, so the countdown ticks + smoothly between Resi's updates instead of stepping +- a reading that differs from the locked offset by more than the link's measured + noise is treated as a **seek** - the lock is dropped, the estimate snaps, and the + cue list is re-fetched immediately rather than on its timer +- playback is only called **PAUSED** once the playhead has been still for clearly + longer than Resi's own reporting cadence, so an irregular gap no longer freezes the + countdown + +`position_update_interval_sec` reports how often Resi is actually updating. That +number is the floor on how fast a jump can possibly be noticed. + +### Beating that floor + +If cues are fired from Companion, the module does not have to wait for Resi to +notice. Add one of these to the same button: + +- **Resync playhead to cue** - give it the cue name; the estimate moves there at once +- **Resync playhead to the NEXT cue** + +The next real reading from Resi confirms or corrects it. + +### Settings that matter + +- **Player position poll (ms)** - 1000 is recommended. Accuracy no longer depends on + this, but a faster poll notices a jump sooner. +- **Cue list refresh (ms)** - 5000. Also forced immediately whenever a seek is seen. +- **Position trim (ms)** - leave at 0. Only needed if the whole pipeline is + consistently behind; positive values push the estimate forward. + +## Startup fix (0.1.2) + +On a Resi that publishes every ~30s, the module could start a few seconds before a +publish and learn a 2s cadence from that partial first gap. It then threw out every +real 30s gap, so `playback_state` flipped to **PAUSED** 15s into each update - the +countdown froze and the next cue lagged, worst with cues close together. + +- the partial gap after startup (or after a manual resync) is no longer learned +- a single outlier gap can no longer lock out the real cadence +- until the cadence is measured, PAUSED waits 45s instead of 15s + +## Resi login back-off (0.1.3) + +0.1.2 retried a failed Resi login on every player poll (once a second, for ever), and +answered every 401/403 by signing in again. With a wrong password, a rate limit or a +login that may not see decoders, that is thousands of sign-ins an hour: Resi replies +with 429 and then locks the account (it locked one at North Attleboro). + +- after any failed login, or a 429 on any request, every Resi call holds off: 15s, + doubling to 5min, or as long as Resi's Retry-After asks +- a 401/403 renews the session only if it is over a minute old; a refusal straight + after signing in is a permission ("ask a Resi admin for access") and holds off +- status and `last_error` say which: locked (USER_LOCKED), rate-limited, password + rejected, no access, or unreachable +- the log says it once per problem, not once a second +- the cache-busting parameter is no longer dropped for good on a 401/403/429 + +## Start-up never crashes on a Resi problem (0.1.4) + +In 0.1.3 a failed Resi login at start-up (here: a locked account) made the module's +init fail. Companion counts that as a crash and restarts the module every few +seconds, and each restart signed in again from scratch, outside the hold-off. + +- init no longer fails when Resi refuses or is down: it logs "Not connected to Resi + yet … will keep trying", starts the account poll, and the hold-off paces retries +- once Resi answers, the configured decoder is picked up automatically +- saving new credentials clears the old hold-off and starts over diff --git a/source/backoff_test.js b/source/backoff_test.js new file mode 100644 index 0000000..0d3df0f --- /dev/null +++ b/source/backoff_test.js @@ -0,0 +1,158 @@ +// A failed or refused Resi login must hold off, not retry on every poll. +// +// Seen at North Attleboro: with a bad password, a rate limit or a login without +// decoder access, 0.1.2 signed in again on every 1s player poll. Resi answered with +// 429s and then locked the account. Drives the real module code on a fake clock +// against a fake Resi; touches nothing real. +// +// node backoff_test.js (defaults to dist/main.js) +// node backoff_test.js path/to/main.js + +'use strict'; +const Module = require('module'); +const path = require('path'); +const assert = require('assert'); + +const target = path.resolve(process.argv[2] || path.join(__dirname, 'dist/main.js')); +const stubs = { + '@companion-module/base': { + InstanceBase: class { updateStatus() {} log() {} setVariableValues() {} }, + InstanceStatus: { Ok: 'ok', Connecting: 'c', ConnectionFailure: 'f', BadConfig: 'b' }, + runEntrypoint() {}, combineRgb() { return 0 }, Regex: {}, + }, + './config.js': { GetConfigFields: () => [] }, + './variables.js': { UpdateVariableDefinitions() {} }, + './upgrades.js': { UpgradeScripts: [] }, + './actions.js': { UpdateActions() {} }, + './feedbacks.js': { UpdateFeedbacks() {} }, + './presets.js': { UpdatePresets() {} }, +}; +const realLoad = Module._load; +Module._load = function (req, parent, isMain) { + if (stubs[req]) return stubs[req]; + return realLoad.apply(this, arguments); +}; + +let now = 1700000000000; +Date.now = () => now; + +let mode = 'limited'; // what the fake Resi does with a login +let logins = 0; +let venueCalls = 0; +let playerCalls = 0; +const reply = (status, body, headers) => ({ + ok: status >= 200 && status < 300, + status, + headers: { get: (k) => (headers || {})[k.toLowerCase()] ?? null, getSetCookie: () => (headers || {})['set-cookie'] || [] }, + json: async () => body, + text: async () => JSON.stringify(body), +}); +global.fetch = async (url, opts) => { + const p = String(url).replace('https://central.resi.io', '').split('?')[0]; + if (p === '/api/v3/login') { + logins++; + if (mode === 'limited') return reply(429, { message: 'Rate limit exceeded' }); + if (mode === 'locked') return reply(401, { code: 'USER_LOCKED', message: 'Unauthorized' }); + return reply(200, {}, { 'set-cookie': ['livingas1=T; Path=/'] }); + } + if (p === '/api_v2.svc/users/me') return reply(200, { customerId: 'C' }); + if (p === '/api/v3/customers/C/venues') { venueCalls++; return reply(mode === 'noaccess' ? 403 : 200, [{ uuid: 'V1', name: 'NA' }]); } + if (p.endsWith('/players')) { + playerCalls++; + return reply(mode === 'noaccess' ? 403 : 200, + [{ playerHardwareId: 'DEC1', userName: 'NA', position: '00:10:00', eventId: null }]); + } + return reply(404, {}); +}; + +const { ModuleInstance } = require(target); + +function fresh() { + const inst = Object.create(ModuleInstance.prototype); + inst.config = { username: 'a@b.c' }; + inst.secrets = { password: 'pw' }; + inst.lastLoginMs = 0; + inst.selectedVenueUuid = 'V1'; + inst.selectedPlayerHardwareId = 'DEC1'; + inst.playerPollInFlight = false; + inst.updateStatus = () => {}; + inst.setVariableValues = () => {}; + inst.warns = []; + inst.log = (lvl, m) => { if (lvl === 'warn' || lvl === 'error') inst.warns.push(m); }; + // no real timers: the test drives the polls itself + inst.startPolling = () => { inst.pollingStarted = true; }; + inst.startPlayerPolling = () => {}; + inst.startSmoothTick = () => {}; + inst.refreshCuesIfDue = async () => {}; + return inst; +} + +async function pollFor(inst, seconds) { + for (let i = 0; i < seconds; i++) { + now += 1000; + await inst.pollPlayer(); + } +} + +let passed = 0; +async function test(name, fn) { await fn(); passed++; console.log(` ok ${name}`); } + +(async () => { + await test('a rate-limited login is not retried every poll', async () => { + mode = 'limited'; logins = 0; + const inst = fresh(); + await pollFor(inst, 300); // five minutes of 1s polls + assert.ok(logins <= 6, `signed in ${logins} times in five rate-limited minutes`); + assert.ok(inst.warns.length <= 6, `logged ${inst.warns.length} warnings (one per poll would be 300)`); + }); + + await test('a locked account says so and holds off', async () => { + mode = 'locked'; logins = 0; + const inst = fresh(); + await pollFor(inst, 120); + assert.ok(logins <= 4, `signed in ${logins} times against a locked account`); + assert.ok(inst.warns.some((w) => /USER_LOCKED/.test(w)), 'the lock is named in the log'); + }); + + await test('it recovers once Resi lets it in, and keeps one session', async () => { + mode = 'limited'; logins = 0; + const inst = fresh(); + await pollFor(inst, 30); + mode = 'ok'; + await pollFor(inst, 330); // past the longest hold-off + const after = logins; + playerCalls = 0; + await pollFor(inst, 30); + assert.strictEqual(logins, after, 'a good session is not signed in again'); + assert.ok(playerCalls >= 29, `polls the decoder normally once in (${playerCalls} in 30s)`); + }); + + await test('a login without decoder access is not signed in every poll', async () => { + mode = 'noaccess'; logins = 0; playerCalls = 0; + const inst = fresh(); + await pollFor(inst, 120); + assert.ok(logins <= 3, `signed in ${logins} times in two minutes for a permission problem`); + assert.ok(playerCalls <= 10, `asked for decoders ${playerCalls} times (a poll each would be 120)`); + assert.ok(inst.warns.some((w) => /ask a Resi admin/.test(w)), 'says what to do about it'); + }); + + // Seen live with 0.1.3: a locked account made init() throw, Companion restarted the + // module every few seconds, and every restart signed in again from scratch. + await test('init survives a locked account, and recovers once it is unlocked', async () => { + mode = 'locked'; logins = 0; + const inst = fresh(); + inst.config.defaultPlayerHardwareId = 'DEC1'; + inst.venues = []; inst.playersByVenueUuid = {}; + await inst.init(inst.config, true, inst.secrets); // must not throw + assert.ok(inst.pollingStarted, 'polling starts even though Resi refused'); + for (let i = 0; i < 60; i++) { now += 10000; await inst.pollOnce(false); } // ten minutes of account polls + // 0s, 15s, 45s, 105s, 225s, 465s: six. The restart loop did about one every 6s. + assert.ok(logins <= 6, `signed in ${logins} times in ten locked minutes`); + mode = 'ok'; + now += 300000; + await inst.pollOnce(false); + assert.strictEqual(inst.selectedVenueUuid, 'V1', 'picks up the configured decoder by itself'); + }); + + console.log(`\n${passed} tests passed`); +})().catch((e) => { console.error(e); process.exit(1); }); diff --git a/source/check_resolve.py b/source/check_resolve.py new file mode 100644 index 0000000..e806702 --- /dev/null +++ b/source/check_resolve.py @@ -0,0 +1,116 @@ +#!/usr/bin/env python3 +"""Walk every .js in a package and check that each require()/import target resolves, +following Node's resolution rules against the vendored node_modules tree.""" +import json +import os +import re +import sys + +ROOT = os.path.abspath(sys.argv[1]) +BUILTIN = set("""assert async_hooks buffer child_process cluster console constants crypto dgram +diagnostics_channel dns domain events fs http http2 https inspector module net os path +perf_hooks process punycode querystring readline repl stream string_decoder sys timers tls +trace_events tty url util v8 vm wasi worker_threads zlib""".split()) + +SPEC = re.compile(r"""(?:require\(|(?:^|[\s;{}])(?:import|export)[^;\n]*?\bfrom\s*|import\()\s*['"]([^'"]+)['"]""", re.M) +DYNAMIC = re.compile(r"require\(\s*[^'\")\s]") +COMMENTS = re.compile(r"/\*.*?\*/|^\s*//.*$", re.S | re.M) +# Optional at runtime: loaded only under a config or platform this module never uses. +OPTIONAL = {"re2", "expo-random", "tinybench", "uri-js", "neostandard"} +SKIP_DIRS = ("test", "benchmark", "benchmarks", "example", "examples", ".github") + + +def load_json(p): + try: + with open(p) as fh: + return json.load(fh) + except Exception: + return {} + + +def resolve_file(base): + for cand in (base, base + ".js", base + ".json", base + ".cjs", base + ".mjs", base + ".node"): + if os.path.isfile(cand): + return cand + if os.path.isdir(base): + pj = load_json(os.path.join(base, "package.json")) + for key in ("main", "module"): + if isinstance(pj.get(key), str): + hit = resolve_file(os.path.join(base, pj[key])) + if hit: + return hit + if pj.get("exports"): + return base # exports map: trust it, too complex to model here + for idx in ("index.js", "index.json", "index.cjs", "index.node"): + if os.path.isfile(os.path.join(base, idx)): + return os.path.join(base, idx) + return None + + +def resolve_bare(spec, from_dir): + d = from_dir + while True: + hit = resolve_file(os.path.join(d, "node_modules", *spec.split("/"))) + if hit: + return hit + # scoped or deep import into a package that exists + parts = spec.split("/") + pkg = "/".join(parts[:2]) if spec.startswith("@") else parts[0] + pkg_dir = os.path.join(d, "node_modules", *pkg.split("/")) + if os.path.isdir(pkg_dir) and len(parts) > (2 if spec.startswith("@") else 1): + sub = resolve_file(os.path.join(pkg_dir, *parts[(2 if spec.startswith("@") else 1):])) + if sub: + return sub + if load_json(os.path.join(pkg_dir, "package.json")).get("exports"): + return pkg_dir + if os.path.dirname(d) == d or len(d) <= len(ROOT) - 1: + return None + d = os.path.dirname(d) + + +missing, dynamic, files, optional_hits = [], [], 0, set() +for dirpath, dirnames, filenames in os.walk(ROOT): + dirnames[:] = [d for d in dirnames if d not in SKIP_DIRS] + if dirpath.endswith((os.sep + "browser", os.sep + "types")): + continue + for fn in filenames: + if not fn.endswith((".js", ".cjs", ".mjs")): + continue + if fn.endswith((".native.js", ".browser.js")) or fn.startswith("eslint.config"): + continue + path = os.path.join(dirpath, fn) + files += 1 + try: + src = COMMENTS.sub("", open(path, encoding="utf-8", errors="replace").read()) + except OSError: + continue + if DYNAMIC.search(src): + dynamic.append(os.path.relpath(path, ROOT)) + for spec in set(SPEC.findall(src)): + if spec.startswith("node:") or spec.split("/")[0] in BUILTIN: + continue + if spec in OPTIONAL: + optional_hits.add((os.path.relpath(path, ROOT), spec)) + continue + if spec.startswith("."): + hit = resolve_file(os.path.normpath(os.path.join(dirpath, spec))) + else: + hit = resolve_bare(spec, dirpath) + if not hit: + missing.append((os.path.relpath(path, ROOT), spec)) + +print("scanned %d js files" % files) +if dynamic: + print("\n%d file(s) use a computed require() (not statically checkable):" % len(dynamic)) + for d in sorted(dynamic)[:12]: + print(" ", d) +if optional_hits: + print("\n%d optional dep(s), not loaded on this platform/config:" % len(optional_hits)) + for f, spec in sorted(optional_hits): + print(" %-64s -> %s" % (f, spec)) +if missing: + print("\nUNRESOLVED (%d):" % len(missing)) + for f, s in sorted(set(missing)): + print(" %-70s -> %s" % (f, s)) + sys.exit(1) +print("\nevery static require/import resolves") diff --git a/source/dist/actions.js b/source/dist/actions.js new file mode 100644 index 0000000..e83e248 --- /dev/null +++ b/source/dist/actions.js @@ -0,0 +1,184 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.UpdateActions = UpdateActions; +function UpdateActions(self) { + self.setActionDefinitions({ + refresh_profile: { + name: 'Refresh profile (users/me)', + options: [], + callback: async () => { + await self.refreshProfileNow(); + }, + }, + refresh_lists: { + name: 'Refresh venues/players list', + options: [], + callback: async () => { + await self.refreshListsNow(); + }, + }, + add_cue_at_position: { + name: 'Add cue at player position (or custom time)', + options: [ + { + id: 'name', + type: 'textinput', + label: 'Cue name', + default: 'Web Cue', + useVariables: true, + }, + { + id: 'privateCue', + type: 'checkbox', + label: 'Private cue', + default: false, + }, + { + id: 'positionMode', + type: 'dropdown', + label: 'Position source', + default: 'player', + choices: [ + { id: 'player', label: 'Player position (current)' }, + { id: 'custom', label: 'Custom time' }, + ], + }, + { + id: 'customPosition', + type: 'textinput', + label: 'Custom position (HH:MM:SS or HH:MM:SS.mmm)', + default: '00:00:00.000', + useVariables: true, + }, + ], + callback: async (evt) => { + const name = (await self.parseVariablesInString(String(evt.options.name ?? ''))).trim(); + const privateCue = Boolean(evt.options.privateCue); + const positionMode = String(evt.options.positionMode ?? 'player'); + const customPosition = (await self.parseVariablesInString(String(evt.options.customPosition ?? ''))).trim(); + await self.addCueFromPosition({ + name, + privateCue, + positionMode, + customPosition, + }); + }, + }, + delete_cue_by_name: { + name: 'Delete cue by name', + options: [ + { + id: 'cueName', + type: 'textinput', + label: 'Cue name', + default: '', + useVariables: true, + }, + { + id: 'matchMode', + type: 'dropdown', + label: 'Match mode', + default: 'exact', + choices: [ + { id: 'exact', label: 'Exact (case-insensitive)' }, + { id: 'contains', label: 'Contains (case-insensitive)' }, + ], + }, + { + id: 'deleteMode', + type: 'dropdown', + label: 'Delete', + default: 'first', + choices: [ + { id: 'first', label: 'First match only' }, + { id: 'all', label: 'All matches' }, + ], + }, + { + id: 'onlyMine', + type: 'checkbox', + label: 'Only delete cues created by this user', + default: true, + }, + ], + callback: async (evt) => { + const cueName = await self.parseVariablesInString(String(evt.options.cueName ?? '')); + const matchMode = String(evt.options.matchMode ?? 'exact'); + const deleteMode = String(evt.options.deleteMode ?? 'first'); + const onlyMine = Boolean(evt.options.onlyMine); + await self.deleteCueByName({ + name: cueName, + matchMode, + deleteMode, + onlyMine, + }); + }, + }, + select_decoder: { + name: 'Select decoder/player', + options: [ + { + id: 'playerId', + type: 'dropdown', + label: 'Decoder / Player', + default: '', + choices: self.getPlayerChoices(), + }, + ], + callback: async (evt) => { + await self.selectPlayer(String(evt.options.playerId || '')); + }, + }, + resync_to_cue: { + name: 'Resync playhead to cue (use on the button that fires it)', + options: [ + { + id: 'cueName', + type: 'textinput', + label: 'Cue name', + default: '', + useVariables: true, + }, + ], + callback: async (evt) => { + const cueName = await self.parseVariablesInString(String(evt.options.cueName ?? '')); + self.resyncToCue(cueName); + }, + }, + resync_to_next_cue: { + name: 'Resync playhead to the NEXT cue', + options: [], + callback: async () => { + self.resyncToNextCue(); + }, + }, + lookup_cue_by_name: { + name: 'Lookup cue by name (stores in lookup_* variables)', + options: [ + { + id: 'cueName', + type: 'textinput', + label: 'Cue name', + default: '', + useVariables: true, + }, + { + id: 'matchMode', + type: 'dropdown', + label: 'Match mode', + default: 'exact', + choices: [ + { id: 'exact', label: 'Exact (case-insensitive)' }, + { id: 'contains', label: 'Contains (case-insensitive)' }, + ], + }, + ], + callback: async (evt) => { + const cueName = await self.parseVariablesInString(String(evt.options.cueName ?? '')); + const mode = String(evt.options.matchMode ?? 'exact'); + self.lookupCueByName(cueName, mode); + }, + }, + }); +} +//# sourceMappingURL=actions.js.map \ No newline at end of file diff --git a/source/dist/config.js b/source/dist/config.js new file mode 100644 index 0000000..b110c72 --- /dev/null +++ b/source/dist/config.js @@ -0,0 +1,65 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.GetConfigFields = GetConfigFields; +function GetConfigFields() { + return [ + { + type: 'textinput', + id: 'username', + label: 'Username / Email', + width: 12, + }, + { + type: 'dropdown', + id: 'defaultPlayerHardwareId', + label: 'Default decoder/player on startup', + width: 12, + default: '', + choices: [{ id: '', label: '(none)' }], + }, + // NEW: polling intervals + { + type: 'number', + id: 'playerPollMs', + label: 'Player position poll (ms)', + width: 6, + min: 250, + max: 30000, + default: 1000, + }, + { + type: 'number', + id: 'positionTrimMs', + label: 'Position trim (ms) - only if it still reads behind', + width: 6, + min: -30000, + max: 30000, + default: 0, + }, + { + type: 'number', + id: 'cuePollMs', + label: 'Cue list refresh (ms)', + width: 6, + min: 1000, + max: 60000, + default: 5000, + }, + { + type: 'number', + id: 'listPollMs', + label: 'User & decoder inf0 poll (ms)', + width: 6, + min: 10000, + max: 3600000, + default: 120000, + }, + { + type: 'secret-text', + id: 'password', + label: 'Password', + width: 12, + } + ]; +} +//# sourceMappingURL=config.js.map \ No newline at end of file diff --git a/source/dist/feedbacks.js b/source/dist/feedbacks.js new file mode 100644 index 0000000..49568db --- /dev/null +++ b/source/dist/feedbacks.js @@ -0,0 +1,113 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.UpdateFeedbacks = UpdateFeedbacks; +const base_1 = require("@companion-module/base"); +function UpdateFeedbacks(self) { + self.setFeedbackDefinitions({ + resi_connected: { + name: 'Resi: Connected (auth OK)', + type: 'boolean', + defaultStyle: { + bgcolor: (0, base_1.combineRgb)(0, 200, 0), + color: (0, base_1.combineRgb)(0, 0, 0), + }, + options: [], + callback: () => { + const v = self.getVariableValue('auth_status') ?? ''; + return v === 'OK'; + }, + }, + resi_error: { + name: 'Resi: Error (auth/API)', + type: 'boolean', + defaultStyle: { + bgcolor: (0, base_1.combineRgb)(200, 0, 0), + color: (0, base_1.combineRgb)(255, 255, 255), + }, + options: [], + callback: () => { + const auth = (self.getVariableValue('auth_status') ?? '').trim(); + const err = (self.getVariableValue('last_error') ?? '').trim(); + // True when we have an error message OR auth isn't OK (but ignore "Missing credentials" if you prefer) + return err.length > 0 || (auth.length > 0 && auth !== 'OK'); + }, + }, + player_active: { + name: 'Resi: Player active (position > 0s)', + type: 'boolean', + defaultStyle: { + bgcolor: (0, base_1.combineRgb)(0, 120, 255), + color: (0, base_1.combineRgb)(255, 255, 255), + }, + options: [], + callback: () => { + const s = self.getVariableValue('current_position_sec') ?? '0'; + const n = Number(s); + return Number.isFinite(n) && n > 0; + }, + }, + approaching_next_cue: { + name: 'Resi: Approaching next cue (<= threshold seconds)', + type: 'boolean', + defaultStyle: { + bgcolor: (0, base_1.combineRgb)(255, 180, 0), + color: (0, base_1.combineRgb)(0, 0, 0), + }, + options: [ + { + id: 'threshold', + type: 'number', + label: 'Threshold (seconds)', + default: 30, + min: 1, + max: 3600, + }, + ], + callback: (fb) => { + const nextName = (self.getVariableValue('next_cue_name') ?? '').trim(); + if (!nextName) + return false; + const s = self.getVariableValue('next_cue_time_in_seconds') ?? ''; + const n = Number(s); + if (!Number.isFinite(n)) + return false; + const thr = Number(fb.options.threshold); + return Number.isFinite(thr) ? n <= thr : false; + }, + }, + playback_frozen: { + name: 'Resi: Playback frozen (position not changing)', + type: 'boolean', + defaultStyle: { + bgcolor: (0, base_1.combineRgb)(200, 0, 0), + color: (0, base_1.combineRgb)(255, 255, 255), + }, + options: [ + { + id: 'staleSeconds', + type: 'number', + label: 'Frozen if unchanged for (seconds)', + default: 6, + min: 2, + max: 120, + }, + ], + callback: (fb) => { + const staleSeconds = Number(fb.options.staleSeconds) || 6; + const curStr = self.getVariableValue('current_position_sec') ?? ''; + const cur = Number(curStr); + if (!Number.isFinite(cur)) + return false; + const now = Date.now(); + const lastStr = self.getVariableValue('playback_last_change_epoch_ms') ?? ''; + const last = Number(lastStr); + // If you haven't implemented playback_last_change_epoch_ms yet, we can't detect freezing reliably. + if (!Number.isFinite(last) || last <= 0) + return false; + const ageSec = (now - last) / 1000; + return ageSec >= staleSeconds; + }, + }, + }); +} +//# sourceMappingURL=feedbacks.js.map \ No newline at end of file diff --git a/source/dist/main.js b/source/dist/main.js new file mode 100644 index 0000000..fc5e7a3 --- /dev/null +++ b/source/dist/main.js @@ -0,0 +1,1076 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ModuleInstance = void 0; +const base_1 = require("@companion-module/base"); +const config_js_1 = require("./config.js"); +const variables_js_1 = require("./variables.js"); +const upgrades_js_1 = require("./upgrades.js"); +const actions_js_1 = require("./actions.js"); +const feedbacks_js_1 = require("./feedbacks.js"); +const presets_js_1 = require("./presets.js"); +class ModuleInstance extends base_1.InstanceBase { + config; + secrets; + cookieHeader = ''; + refreshToken; + livingas1; + pollTimer; + pollInFlight = false; + lastLoginMs = 0; + loginInFlight; + customerId; + venues = []; + playersByVenueUuid = {}; + cues = []; + selectedVenueUuid; + selectedPlayerHardwareId; + playerPollTimer; + playerPollInFlight = false; + currentEventId; + currentEventProfileId; + eventMediaStartEpochMs; + lastPlayerPosition; + lastCueRefreshMs = 0; + cueRefreshInFlight = false; + lastPositionSec; + constructor(internal) { + super(internal); + } + async init(config, _isFirstInit, secrets) { + this.config = config; + this.secrets = secrets; + this.updateStatus(base_1.InstanceStatus.Connecting, 'Initializing'); + this.updateActions(); + this.updateFeedbacks(); + this.updatePresets(); + this.updateVariableDefinitions(); + // A Resi problem must never fail init: Companion treats that as a crash and + // restarts the module every few seconds, each restart a fresh process with no + // hold-off -- a sign-in every few seconds, which is how an account gets locked. + // So start what can be started, and let the polls (and their hold-off) retry. + try { + await this.startResi(false); + } + catch (err) { + this.log('warn', `Not connected to Resi yet: ${err?.message ?? err} — will keep trying`); + } + finally { + this.startPolling(); + } + } + /** Sign in, load venues/decoders, and follow the configured decoder. */ + async startResi(forceLogin) { + // Auth + customerId + await this.refreshProfileSmart(forceLogin); + // Load venues/players + await this.refreshVenuesAndPlayers(); + // Auto-select default player if configured + if (this.config.defaultPlayerHardwareId) { + await this.selectPlayer(this.config.defaultPlayerHardwareId); + } + } + async configUpdated(config, secrets) { + this.config = config; + this.secrets = secrets; + // New credentials: start over, so the hold-off of the old ones doesn't apply. + this.clearHold(); + this.cookieHeader = ''; + try { + await this.startResi(true); + } + catch (err) { + this.log('warn', `Not connected to Resi yet: ${err?.message ?? err} — will keep trying`); + } + this.startPolling(); + } + // Return config fields for web config + getConfigFields() { + const fields = (0, config_js_1.GetConfigFields)(); + // Patch in current player choices + for (const f of fields) { + if (f.type === 'dropdown' && f.id === 'defaultPlayerHardwareId') { + f.choices = [{ id: '', label: '(none)' }, ...this.getPlayerChoices()]; + } + } + return fields; + } + updateActions() { + (0, actions_js_1.UpdateActions)(this); + } + updateFeedbacks() { + (0, feedbacks_js_1.UpdateFeedbacks)(this); + } + updatePresets() { + (0, presets_js_1.UpdatePresets)(this); + } + updateVariableDefinitions() { + (0, variables_js_1.UpdateVariableDefinitions)(this); + } + async refreshProfileSmart(forceLogin = false) { + try { + await this.ensureAuthenticated(forceLogin); + if (!this.cookieHeader) + return; // missing creds or login not possible yet + await this.fetchProfile(); + this.updateStatus(base_1.InstanceStatus.Ok); + this.setVariableValues({ auth_status: 'OK', last_error: '' }); + } + catch (err) { + const msg = err?.message ?? String(err); + this.setVariableValues({ auth_status: 'Auth/profile failed', last_error: msg }); + this.log('error', `Refresh failed: ${msg}`); + this.updateStatus(base_1.InstanceStatus.ConnectionFailure, 'Refresh failed'); + throw err; + } + } + async resiLogin(username, password) { + const res = await fetch('https://central.resi.io/api/v3/login?newToken=true', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + Accept: 'application/json', + }, + body: JSON.stringify({ userName: username, password }), + }); + if (!res.ok) { + let detail = ''; + const j = (await res.json().catch(() => undefined)); + if (j) + detail = [j?.code, j?.message ?? j?.error].filter(Boolean).join(' ') || JSON.stringify(j); + else + detail = await res.text().catch(() => ''); + const e = new Error(`Login failed (${res.status}) ${detail}`.trim()); + e.status = res.status; + e.retryAfterMs = (Number(res.headers.get('retry-after')) || 0) * 1000; + e.code = j?.code; + throw e; + } + // Node 18+ (Companion) supports getSetCookie() + const setCookies = res.headers.getSetCookie?.() ?? + (res.headers.get('set-cookie') ? [res.headers.get('set-cookie')] : []); + const cookies = {}; + for (const sc of setCookies) { + const first = sc.split(';')[0]; + const idx = first.indexOf('='); + if (idx > 0) + cookies[first.slice(0, idx)] = first.slice(idx + 1); + } + this.refreshToken = cookies.refreshToken; + this.livingas1 = cookies.livingas1; + const parts = []; + if (this.refreshToken) + parts.push(`refreshToken=${this.refreshToken}`); + if (this.livingas1) + parts.push(`livingas1=${this.livingas1}`); + this.cookieHeader = parts.join('; '); + } + async getUsersMe() { + const res = await fetch('https://central.resi.io/api_v2.svc/users/me', { + method: 'GET', + headers: { + Accept: 'application/json', + Cookie: this.cookieHeader, + ...(this.livingas1 ? { authorization: `X-Bearer ${this.livingas1}` } : {}), + }, + }); + if (!res.ok) { + throw new Error(`/users/me failed (${res.status})`); + } + return res.json(); + } + /* A failed login used to be retried on the very next poll -- once a second, for + ever -- and a 401/403 forced a fresh login every time. Resi answers that with + 429s and, kept up, locks the account (it did, at North Attleboro). So any + failure now holds off every Resi call: 15s, doubling to 5min, or as long as + Resi's Retry-After asks. Calls in between fail at once with the reason. */ + holdOff(reason, askedMs = 0) { + this.__holdFailures = (this.__holdFailures ?? 0) + 1; + const backoff = Math.min(300000, 15000 * 2 ** (this.__holdFailures - 1)); + this.__holdUntil = Date.now() + Math.max(backoff, askedMs || 0); + this.__holdReason = reason; + this.updateStatus(base_1.InstanceStatus.ConnectionFailure, reason); + } + clearHold() { + this.__holdFailures = 0; + this.__holdUntil = 0; + this.__holdReason = ''; + } + checkHold() { + if (Date.now() < (this.__holdUntil ?? 0)) { + const wait = Math.ceil((this.__holdUntil - Date.now()) / 1000); + throw new Error(`${this.__holdReason} — retrying in ${wait}s`); + } + } + /** A refusal straight after signing in is a permission; only an older session is renewed. */ + sessionIsFresh() { + return Date.now() - (this.lastLoginMs ?? 0) < 60000; + } + /** 401/403/429 from any Resi request: renew an old session once, otherwise hold off. */ + noteRefusal(status, what, retryAfterMs = 0) { + if (status === 429) { + this.holdOff('Resi is rate-limiting this account (429)', retryAfterMs); + return; + } + if ((status === 401 || status === 403) && !this.sessionIsFresh()) { + this.cookieHeader = ''; // the next call signs in again, once + return; + } + if (status === 401 || status === 403) + this.holdOff(`This Resi login isn't allowed to see ${what} (${status}) — ask a Resi admin for access`); + } + async ensureAuthenticated(force = false) { + this.checkHold(); + if (force && this.sessionIsFresh() && this.cookieHeader) + force = false; // just signed in: signing in again won't change the answer + const username = this.config.username; + const password = this.secrets?.password; + if (!username || !password) { + this.updateStatus(base_1.InstanceStatus.BadConfig, 'Missing username/password'); + this.setVariableValues({ + auth_status: 'Missing credentials', + last_error: 'Enter username/password in config', + }); + return; + } + // If we already have cookies and it hasn’t been too long, skip login + const ageMs = Date.now() - this.lastLoginMs; + const shouldRelogin = force || !this.cookieHeader || ageMs > 50 * 60 * 1000; // 50 minutes + if (!shouldRelogin) + return; + // De-dupe concurrent logins + if (!this.loginInFlight) { + this.loginInFlight = (async () => { + try { + this.updateStatus(base_1.InstanceStatus.Connecting, 'Logging in'); + await this.resiLogin(username, password); + this.lastLoginMs = Date.now(); + this.clearHold(); + this.updateStatus(base_1.InstanceStatus.Ok, 'Connected'); + this.setVariableValues({ auth_status: 'OK', last_error: '' }); + } + catch (err) { + const msg = err?.message ?? String(err); + const reason = err?.code === 'USER_LOCKED' ? 'Resi has locked this account (USER_LOCKED)' + : err?.status === 429 ? 'Resi is rate-limiting this login (429)' + : err?.status === 400 || err?.status === 401 ? `Resi rejected the login (${err.status}) — check the password` + : err?.status ? `Resi login failed (${err.status})` : `Resi unreachable (${msg})`; + this.holdOff(reason, err?.retryAfterMs); + this.setVariableValues({ auth_status: 'Auth failed', last_error: `${reason} (${msg})` }); + // Same words as the held-off calls that follow, so the log says it once. + throw new Error(reason); + } + })().finally(() => { + this.loginInFlight = undefined; + }); + } + await this.loginInFlight; + } + async fetchProfile() { + this.updateStatus(base_1.InstanceStatus.Connecting, 'Fetching profile'); + const me = await this.getUsersMe(); + this.customerId = me.customerId; + this.setVariableValues({ + org_name: me.customerName ?? '', + first_name: me.firstName ?? '', + last_name: me.lastName ?? '', + email: me.userName ?? '', + }); + return me; + } + async refreshProfileNow() { + await this.refreshProfileSmart(true); // force login on manual refresh + this.setVariableValues({ last_poll: new Date().toLocaleString() }); + } + getPlayerChoices() { + const choices = []; + for (const v of this.venues) { + const players = this.playersByVenueUuid[v.uuid] ?? []; + for (const p of players) { + choices.push({ + id: p.playerHardwareId, + label: `${v.userName} → ${p.userName} (${p.playerHardwareId})`, + }); + } + } + return choices; + } + async refreshListsNow() { + await this.refreshProfileSmart(false); + await this.refreshVenuesAndPlayers(); + } + async selectPlayer(playerHardwareId) { + this.selectedPlayerHardwareId = playerHardwareId; + // find which venue it's in + this.selectedVenueUuid = undefined; + for (const v of this.venues) { + if ((this.playersByVenueUuid[v.uuid] ?? []).some((p) => p.playerHardwareId === playerHardwareId)) { + this.selectedVenueUuid = v.uuid; + break; + } + } + this.setVariableValues({ + auth_status: this.selectedVenueUuid ? 'Player selected' : 'Player selected (venue not found)', + }); + this.startPlayerPolling(); + this.startSmoothTick(); + } + // If the API hands us a timestamp for when this reading was taken, the sample's + // true age is known and the pipeline lag drops out. Name hint + a tight window + // so an event start time can never be mistaken for one. + detectSampleTime(p) { + const now = Date.now(); + for (const k of Object.keys(p || {})) { + if (!/updat|time|stamp|sampl|asof|as_of|checkin|heartbeat|report|seen/i.test(k)) + continue; + const v = p[k]; + let t; + if (typeof v === 'number' && v > 1e12 && v < 4e12) + t = v; + else if (typeof v === 'string' && /^\d{4}-\d{2}-\d{2}T/.test(v)) { + const d = Date.parse(v); + if (!Number.isNaN(d)) + t = d; + } + if (t !== undefined && Math.abs(now - t) < 60000) + return t; + } + return undefined; + } + notePlayheadSample(mediaMs, player) { + if (!Number.isFinite(mediaMs)) + return; + const nowMs = Date.now(); + if (player) + this.setVariableValues({ player_fields: Object.keys(player).sort().join(',') }); + if (mediaMs !== this.__lastSampleMediaMs) { + const takenAt = (player ? this.detectSampleTime(player) : undefined) ?? nowMs; + // media time minus wall time. Constant while playing at 1x; the LARGEST + // recent value is the least-delayed reading, which is the one to trust. + const off = mediaMs - takenAt; + // How far apart honest readings sit: a slow round trip or a late poll + // makes a reading look older than it is, and that spread is this link's + // noise floor. Anything inside it is noise; only a change clearly beyond + // it is a real seek. Measured, not assumed, and kept across resets. + const spreads = this.__spreads ?? []; + const noise = spreads.length ? spreads.reduce((m, v) => (v > m ? v : m), 0) : 0; + const jumpThreshold = Math.max(5000, noise * 1.5 + 4000); + if (this.__baseOffset !== undefined) { + const delta = off - this.__baseOffset; + if (Math.abs(delta) > jumpThreshold) { + // A discontinuity: seek, fired cue, or resume after a pause. + // The window describes the old position and has to go. + this.__offsets = []; + this.__seeked = true; + // Only abandon the no-going-backwards guard for a move big enough + // that snapping is obviously right; a marginal call must not make + // the displayed playhead lurch backwards. + if (Math.abs(delta) > 10000) + this.__lastEstMs = undefined; + } + else if (delta < 0) { + this.__spreads = spreads.concat(-delta).slice(-20); + } + } + // The first reading lands at an arbitrary point in Resi's cycle, so the gap + // from it to the next one is only a fraction of the real cadence. Learning + // from it locked in a 2s cadence that rejected every honest 30s gap. + if (this.__lastNewSampleAt !== undefined && (this.__sampleChanges ?? 0) > 0) { + const gap = nowMs - this.__lastNewSampleAt; + // The gap either side of a pause is not Resi's cadence -- recording it + // would inflate the estimate and make the NEXT pause slow to notice. + // But a pause is one gap; twice in a row is the cadence having changed. + const worstGap = (this.__gaps ?? []).reduce((m, g) => (g > m ? g : m), 0); + if (gap > 0 && gap < 60000) { + if (!worstGap || gap <= worstGap * 3 || this.__gapRejected) { + this.__gaps = (this.__gaps ?? []).concat(gap).slice(-8); + this.__gapRejected = false; + } + else { + this.__gapRejected = true; + } + } + } + if (this.__lastNewSampleAt !== undefined) + this.__sampleChanges = (this.__sampleChanges ?? 0) + 1; + this.__offsets = (this.__offsets ?? []).concat({ t: nowMs, off }); + this.__lastSampleMediaMs = mediaMs; + this.__lastNewSampleAt = nowMs; + } + const kept = (this.__offsets ?? []).filter((o) => nowMs - o.t <= 120000); + // Always keep the newest reading even once it ages out. If the window empties + // during a long pause there is nothing left to compare against, so the resume + // reads as an ordinary reading instead of the discontinuity it is. + this.__offsets = kept.length ? kept : (this.__offsets ?? []).slice(-1); + this.__baseOffset = this.__offsets.length + ? this.__offsets.reduce((m, o) => (o.off > m ? o.off : m), -Infinity) + : undefined; + } + applySmoothVars() { + if (this.__lastNewSampleAt === undefined) + return; + const nowMs = Date.now(); + const gaps = this.__gaps ?? []; + const cadence = gaps.length ? gaps.reduce((m, g) => (g > m ? g : m), 0) : 0; + // Only call it paused once the playhead has been still for clearly longer + // than Resi's own (irregular) reporting cadence. + // Until a full gap has been measured the cadence is unknown; assume the slowest + // Resi plausibly is, or a 30s publisher looks paused 15s after every startup. + const pauseAfter = cadence ? Math.max(15000, Math.min(45000, cadence * 2.5 + 6000)) : 45000; + const sinceNew = nowMs - this.__lastNewSampleAt; + const playing = this.__baseOffset !== undefined && sinceNew < pauseAfter; + this.setVariableValues({ + playback_state: playing ? 'PLAYING' : 'PAUSED', + position_update_interval_sec: cadence ? String(Math.round(cadence / 1000)) : '', + }); + let est; + if (playing) { + const trim = Number(this.config.positionTrimMs ?? 0) || 0; + est = nowMs + this.__baseOffset + trim; + // the offset window is a max, so it can only dip when the best sample ages + // out -- never show the playhead running backwards because of that + if (this.__lastEstMs !== undefined && est < this.__lastEstMs) + est = this.__lastEstMs; + this.__lastEstMs = est; + } + else { + est = this.__lastEstMs ?? this.__lastSampleMediaMs; + } + this.computeAndSetCueVars(est); + this.setVariableValues({ + current_position: this.msToHmsMs(est), + current_position_sec: String(Math.floor(est / 1000)), + }); + } + msToHmsMs(total) { + const t = Math.max(0, Math.floor(total)); + const hh = Math.floor(t / 3600000); + const mm = Math.floor((t % 3600000) / 60000); + const ss = Math.floor((t % 60000) / 1000); + const ms = t % 1000; + const pad = (n, w) => String(n).padStart(w, '0'); + return `${pad(hh, 2)}:${pad(mm, 2)}:${pad(ss, 2)}.${pad(ms, 3)}`; + } + // Resi only republishes `position` every few seconds, so a fired cue is invisible + // until it does. If the operator fires it from Companion they already know where + // the playhead landed -- this takes their word for it and lets the next real + // sample confirm or correct it. + resyncToCue(cueName) { + const want = String(cueName ?? '').trim().toLowerCase(); + const cue = (this.cues ?? []).find((c) => String(c.name ?? '').trim().toLowerCase() === want); + if (!cue) { + this.log('warn', `Resync: no cue named "${cueName}"`); + this.setVariableValues({ last_error: `Resync: no cue named "${cueName}"` }); + return false; + } + this.resyncToPosition(cue.positionMs); + return true; + } + resyncToNextCue() { + const here = this.__lastEstMs ?? this.__lastSampleMediaMs; + if (!Number.isFinite(here)) + return false; + const next = (this.cues ?? []).find((c) => c.positionMs > here); + if (!next) { + this.log('warn', 'Resync: there is no next cue to jump to'); + return false; + } + this.resyncToPosition(next.positionMs); + return true; + } + resyncToPosition(mediaMs) { + if (!Number.isFinite(mediaMs)) + return; + const nowMs = Date.now(); + this.__offsets = [{ t: nowMs, off: mediaMs - nowMs }]; + this.__baseOffset = mediaMs - nowMs; + this.__lastEstMs = undefined; + this.__lastSampleMediaMs = undefined; // the next poll counts as a fresh sample + this.__lastNewSampleAt = nowMs; + this.__sampleChanges = 0; // the gap from here to the next reading is partial too + this.lastCueRefreshMs = 0; + this.applySmoothVars(); + } + startSmoothTick() { + if (this.__tickTimer) + clearInterval(this.__tickTimer); + this.__tickTimer = setInterval(() => { + try { + this.applySmoothVars(); + } + catch (e) { + // a display tick must never kill the instance + } + }, 1000); + } + startPlayerPolling() { + if (this.playerPollTimer) + clearInterval(this.playerPollTimer); + const ms = Math.max(250, Number(this.config.playerPollMs ?? 1000) || 1000); + this.playerPollTimer = setInterval(() => { + void this.pollPlayer(); + }, ms); + } + async pollPlayer() { + if (this.playerPollInFlight) + return; + this.playerPollInFlight = true; + try { + if (!this.selectedVenueUuid || !this.selectedPlayerHardwareId) + return; + await this.ensureAuthenticated(false); + if (!this.cookieHeader) + return; + // A stale cached reading looks exactly like a laggy playhead, so ask for a + // fresh one. If the service objects to the cache-busting parameter, drop it + // and never send it again rather than failing every poll. + const playersUrl = `https://central.resi.io/api_v2.svc/users/${this.selectedVenueUuid}/players`; + const noCacheHeaders = { ...this.buildAuthHeaders(), 'Cache-Control': 'no-cache', Pragma: 'no-cache' }; + let res = await fetch(this.__noCacheBust ? playersUrl : `${playersUrl}?_=${Date.now()}`, { + method: 'GET', + headers: noCacheHeaders, + }); + if (!res.ok && !this.__noCacheBust && res.status >= 400 && res.status < 500 + && ![401, 403, 429].includes(res.status)) { + this.__noCacheBust = true; + this.log('info', 'players: retrying without the cache-busting parameter'); + res = await fetch(playersUrl, { method: 'GET', headers: noCacheHeaders }); + } + if (!res.ok) { + this.noteRefusal(res.status, "this venue's decoders", + (Number(res.headers.get('retry-after')) || 0) * 1000); + throw new Error(`players poll failed (${res.status})`); + } + const players = (await res.json()); + const p = players.find((x) => x.playerHardwareId === this.selectedPlayerHardwareId); + // Guard: player not found + if (!p) { + this.setVariableValues({ + auth_status: 'Selected player not found', + last_error: 'Selected playerHardwareId not present in /players response', + }); + return; + } + const posMs = this.parseTimeToMs(p.position ?? '00:00:00'); + const eventId = p.eventId ?? undefined; + const posSec = Math.floor(posMs / 1000); + if (this.lastPositionSec === undefined || this.lastPositionSec !== posSec) { + this.lastPositionSec = posSec; + this.setVariableValues({ + playback_last_change_epoch_ms: String(Date.now()), + }); + } + this.setVariableValues({ + current_position: p.position ?? '', + current_position_sec: String(posSec), + current_event_id: eventId ?? '', + last_error: '', + }); + this.lastPlayerPosition = p.position ?? ''; + // If event changed, refresh cues + capture event startTime -> eventMediaStartEpochMs + if (eventId && eventId !== this.currentEventId) { + this.currentEventId = eventId; + this.eventMediaStartEpochMs = undefined; + await this.refreshEventProfileAndCues(); + } + // --- playhead estimator: record this sample (patched) --- + this.notePlayheadSample(posMs, p); + this.applySmoothVars(); + if (this.__seeked) { + this.__seeked = false; + this.lastCueRefreshMs = 0; // make the cue list catch up now, not on the next tick + } + // --- end patch --- + this.__lastPollWarn = ''; // a later failure is news again + await this.refreshCuesIfDue(); + } + catch (err) { + const msg = err?.message ?? String(err); + // Logged when the reason changes, not on every 1s poll of a held-off account. + const gist = msg.replace(/ — retrying in \d+s$/, ''); + if (gist !== this.__lastPollWarn) + this.log('warn', `Player poll failed: ${msg}`); + this.__lastPollWarn = gist; + this.setVariableValues({ + auth_status: 'Player poll failed', + last_error: msg, + }); + } + finally { + this.playerPollInFlight = false; + } + } + async refreshEventProfileAndCues() { + if (!this.customerId || !this.currentEventId) + return; + await this.ensureAuthenticated(false); + if (!this.cookieHeader) + return; + const evRes = await fetch(`https://central.resi.io/api/v3/customers/${this.customerId}/events/${this.currentEventId}`, { method: 'GET', headers: this.buildAuthHeaders() }); + if (!evRes.ok) + throw new Error(`event detail failed (${evRes.status})`); + const ev = (await evRes.json()); + this.currentEventProfileId = ev.eventProfileId; + // anchor ToD off event startTime + if (ev.startTime) { + const t = Date.parse(ev.startTime); + if (!Number.isNaN(t)) + this.eventMediaStartEpochMs = t; + } + // cues + const cuesRes = await fetch(`https://central.resi.io/api_v2.svc/streamprofiles/${this.currentEventProfileId}/events/${this.currentEventId}/cues?canISetCues=1`, { method: 'GET', headers: this.buildAuthHeaders() }); + if (!cuesRes.ok) + throw new Error(`cues failed (${cuesRes.status})`); + const cuesJson = (await cuesRes.json()); + this.cues = cuesJson + .map((c) => ({ + uuid: c.uuid, + name: c.name, + user: c.user, + privateCue: c.privateCue, + positionMs: this.parseTimeToMs(c.position), + })) + .sort((a, b) => a.positionMs - b.positionMs); + this.log('info', `Loaded ${this.cues.length} cues for event ${this.currentEventId}`); + this.setVariableValues({ + event_id: this.currentEventId ?? '', + cue_count: String(this.cues.length), + cue_names: this.cues.map((c) => c.name).join(', '), + }); + } + startPolling() { + if (this.pollTimer) + clearInterval(this.pollTimer); + const ms = Math.max(10000, Number(this.config.listPollMs ?? 120000) || 120000); + this.pollTimer = setInterval(() => { + void this.pollOnce(false); + }, ms); + setTimeout(() => void this.pollOnce(false), 2000); + } + async pollOnce(isManual) { + if (this.pollInFlight) + return; + this.pollInFlight = true; + try { + await this.ensureAuthenticated(false); + if (!this.cookieHeader) + return; + try { + await this.fetchProfile(); + } + catch (err) { + const status = err?.status ?? err?.response?.status; + const msg = err?.message ?? String(err); + if (String(msg).includes('401') || String(msg).includes('403') || status === 401 || status === 403) { + // Renewed only if the session is old enough to have expired; a + // refusal of a fresh one is a permission and holds off instead. + if (this.sessionIsFresh()) { + this.noteRefusal(String(msg).includes('401') ? 401 : 403, 'its own profile'); + throw err; + } + await this.ensureAuthenticated(true); + await this.fetchProfile(); + } + else { + throw err; + } + } + // Optionally keep lists fresh on the same interval: + await this.refreshVenuesAndPlayers(); + // A start that failed (Resi down, account held off) left no decoder followed; + // pick the configured one up as soon as Resi answers. + if (this.config.defaultPlayerHardwareId && !this.selectedVenueUuid) + await this.selectPlayer(this.config.defaultPlayerHardwareId); + this.setVariableValues({ + last_poll: new Date().toLocaleString(), + }); + this.updateStatus(base_1.InstanceStatus.Ok); + } + catch (err) { + const msg = err?.message ?? String(err); + this.setVariableValues({ + auth_status: isManual ? 'Manual refresh failed' : 'Poll failed', + last_error: msg, + last_poll: new Date().toLocaleString(), + }); + this.updateStatus(base_1.InstanceStatus.ConnectionFailure, 'Poll failed'); + } + finally { + this.pollInFlight = false; + } + } + buildAuthHeaders() { + return { + Accept: 'application/json', + Cookie: this.cookieHeader, + ...(this.livingas1 ? { authorization: `X-Bearer ${this.livingas1}` } : {}), + }; + } + parseTimeToMs(s) { + // Accept: "HH:MM:SS", "HH:MM:SS.mmm", "MM:SS", "MM:SS.mmm", "SS", "SS.mmm" + if (!s || typeof s !== 'string') + return 0; + const [timePart, msPartRaw] = s.trim().split('.'); + const parts = timePart.split(':').map((p) => p.trim()).filter(Boolean); + const msPart = msPartRaw ? msPartRaw.padEnd(3, '0').slice(0, 3) : '0'; + const ms = Number(msPart); + let hh = 0, mm = 0, ss = 0; + if (parts.length === 3) { + hh = Number(parts[0]); + mm = Number(parts[1]); + ss = Number(parts[2]); + } + else if (parts.length === 2) { + mm = Number(parts[0]); + ss = Number(parts[1]); + } + else if (parts.length === 1) { + ss = Number(parts[0]); + } + else { + return 0; + } + if (![hh, mm, ss, ms].every((n) => Number.isFinite(n))) + return 0; + return ((hh * 60 + mm) * 60 + ss) * 1000 + ms; + } + msToHms(ms) { + const total = Math.max(0, Math.floor(ms)); + const hh = Math.floor(total / 3600000); + const mm = Math.floor((total % 3600000) / 60000); + const ss = Math.floor((total % 60000) / 1000); + const mmm = total % 1000; + return `${String(hh).padStart(2, '0')}:${String(mm).padStart(2, '0')}:${String(ss).padStart(2, '0')}.${String(mmm).padStart(3, '0')}`; + } + formatTod(epochMs) { + // 24-hour time, Companion host timezone + return new Date(epochMs).toLocaleTimeString([], { + hour: '2-digit', + minute: '2-digit', + second: '2-digit', + hour12: false, + }); + } + secondsToHms(totalSeconds) { + const s = Math.max(0, Math.floor(totalSeconds)); + const hh = Math.floor(s / 3600); + const mm = Math.floor((s % 3600) / 60); + const ss = s % 60; + return `${String(hh).padStart(2, '0')}:${String(mm).padStart(2, '0')}:${String(ss).padStart(2, '0')}`; + } + computeAndSetCueVars(posMs) { + if (!Number.isFinite(posMs)) { + this.log('warn', `posMs is not finite. current_position parse failed.`); + this.setVariableValues({ + next_cue_name: '', + next_cue_time_in_seconds: '', + next_cue_time_in_hms: '', + next_cue_position: '', + next_cue_tod: '', + prev_cue_name: '', + prev_cue_time_ago_in_seconds: '', + prev_cue_time_ago_in_hms: '', + prev_cue_position: '', + prev_cue_tod: '', + }); + return; + } + if (!this.cues || this.cues.length === 0) { + this.setVariableValues({ + next_cue_name: '', + next_cue_time_in_seconds: '', + next_cue_time_in_hms: '', + next_cue_position: '', + next_cue_tod: '', + prev_cue_name: '', + prev_cue_time_ago_in_seconds: '', + prev_cue_time_ago_in_hms: '', + prev_cue_position: '', + prev_cue_tod: '', + }); + return; + } + // Find next cue (first > posMs) and prev cue (last <= posMs) + let next; + let prev; + for (const c of this.cues) { + if (c.positionMs > posMs) { + next = c; + break; + } + prev = c; + } + const vars = {}; + // --- NEXT --- + if (next) { + const secsUntil = Math.max(0, Math.ceil((next.positionMs - posMs) / 1000)); + vars.next_cue_name = next.name ?? ''; + vars.next_cue_time_in_seconds = String(secsUntil); + vars.next_cue_time_in_hms = this.secondsToHms(secsUntil); + vars.next_cue_position = this.msToHms(next.positionMs); + vars.next_cue_tod = this.eventMediaStartEpochMs + ? this.formatTod(this.eventMediaStartEpochMs + next.positionMs) + : ''; + } + else { + // Optional fallback if user wants a default countdown when there is no "next cue" + const fallback = Number(this.config.noNextCueSeconds ?? 0); + const secs = Number.isFinite(fallback) && fallback > 0 ? Math.floor(fallback) : NaN; + vars.next_cue_name = ''; + vars.next_cue_time_in_seconds = Number.isFinite(secs) ? String(secs) : ''; + vars.next_cue_time_in_hms = Number.isFinite(secs) ? this.secondsToHms(secs) : ''; + vars.next_cue_position = ''; + vars.next_cue_tod = ''; + } + // --- PREV --- + if (prev) { + const secsAgo = Math.max(0, Math.floor((posMs - prev.positionMs) / 1000)); + vars.prev_cue_name = prev.name ?? ''; + vars.prev_cue_time_ago_in_seconds = String(secsAgo); + vars.prev_cue_time_ago_in_hms = this.secondsToHms(secsAgo); + vars.prev_cue_position = this.msToHms(prev.positionMs); + vars.prev_cue_tod = this.eventMediaStartEpochMs + ? this.formatTod(this.eventMediaStartEpochMs + prev.positionMs) + : ''; + } + else { + vars.prev_cue_name = ''; + vars.prev_cue_time_ago_in_seconds = ''; + vars.prev_cue_time_ago_in_hms = ''; + vars.prev_cue_position = ''; + vars.prev_cue_tod = ''; + } + this.setVariableValues(vars); + } + async refreshVenuesAndPlayers() { + if (!this.customerId) + return; + await this.ensureAuthenticated(false); + if (!this.cookieHeader) + return; + // venues + const venuesRes = await fetch(`https://central.resi.io/api/v3/customers/${this.customerId}/venues`, { + method: 'GET', + headers: this.buildAuthHeaders(), + }); + if (!venuesRes.ok) { + this.noteRefusal(venuesRes.status, 'its venues', (Number(venuesRes.headers.get('retry-after')) || 0) * 1000); + throw new Error(`venues failed (${venuesRes.status})`); + } + const venuesJson = (await venuesRes.json()); + this.venues = venuesJson; + // players per venue + this.playersByVenueUuid = {}; + for (const v of this.venues) { + const playersRes = await fetch(`https://central.resi.io/api_v2.svc/users/${v.uuid}/players`, { + method: 'GET', + headers: this.buildAuthHeaders(), + }); + if (!playersRes.ok) + continue; + const playersJson = (await playersRes.json()); + this.playersByVenueUuid[v.uuid] = playersJson.map((p) => ({ + playerHardwareId: p.playerHardwareId, + userName: p.userName, + position: p.position, + eventId: p.eventId, + })); + } + // refresh action dropdown choices + this.updateActions(); + } + lookupCueByName(queryRaw, mode = 'exact') { + const query = (queryRaw ?? '').trim(); + this.setVariableValues({ lookup_cue_query: query }); + if (!query) { + this.setVariableValues({ + lookup_cue_found: 'false', + lookup_cue_name: '', + lookup_cue_uuid: '', + lookup_cue_position: '', + lookup_cue_position_sec: '', + lookup_cue_tod: '', + }); + return; + } + const norm = (s) => s.trim().toLowerCase(); + const match = mode === 'contains' + ? this.cues.find((c) => norm(c.name).includes(norm(query))) + : this.cues.find((c) => norm(c.name) === norm(query)); + if (!match) { + this.setVariableValues({ + lookup_cue_found: 'false', + lookup_cue_name: '', + lookup_cue_uuid: '', + lookup_cue_position: '', + lookup_cue_position_sec: '', + lookup_cue_tod: '', + }); + return; + } + this.setVariableValues({ + lookup_cue_found: 'true', + lookup_cue_name: match.name ?? '', + lookup_cue_uuid: match.uuid ?? '', + lookup_cue_position: this.msToHms(match.positionMs), + lookup_cue_position_sec: String(Math.floor(match.positionMs / 1000)), + lookup_cue_tod: this.eventMediaStartEpochMs ? this.formatTod(this.eventMediaStartEpochMs + match.positionMs) : '', + }); + } + isValidHmsMs(s) { + // Accept HH:MM:SS or HH:MM:SS.mmm (hours can be 1+ digits) + return /^\d+:[0-5]\d:[0-5]\d(\.\d{1,3})?$/.test(s.trim()); + } + normalizeHmsMs(s) { + // Ensure we always send HH:MM:SS.mmm + const trimmed = (s ?? '').trim(); + const [timePart, msRaw] = trimmed.split('.'); + const ms = (msRaw ?? '0').padEnd(3, '0').slice(0, 3); + // If they typed "4:00:00", keep it (hours can be 1 digit) but add .mmm + return `${timePart}.${ms}`; + } + async refreshCuesIfDue() { + // Must have an event loaded + if (!this.currentEventId || !this.currentEventProfileId) + return; + // Don’t overlap cue refreshes + if (this.cueRefreshInFlight) + return; + // How often to refresh cues while playing (ms) + // If you want “every player poll”, set this to your playerPollMs, + // but recommended: 10000–30000. + const intervalMs = Math.max(1000, Number(this.config.cuePollMs ?? 5000) || 5000); + const now = Date.now(); + if (now - this.lastCueRefreshMs < intervalMs) + return; + this.cueRefreshInFlight = true; + this.lastCueRefreshMs = now; + try { + await this.refreshEventProfileAndCues(); + } + catch (err) { + // Don’t hard-fail playback polling if cues refresh fails + this.log('warn', `Cue refresh failed: ${err?.message ?? err}`); + } + finally { + this.cueRefreshInFlight = false; + } + } + /** + * Adds a cue to the currently-selected event, at either current player position or a custom time. + */ + async addCueFromPosition(opts) { + const cueName = (opts.name ?? '').trim(); + if (!cueName) + throw new Error('Cue name is required'); + if (!this.currentEventId || !this.currentEventProfileId) { + throw new Error('No active event loaded yet. Select a player/event first.'); + } + const user = (this.config.username ?? '').trim(); + if (!user) + throw new Error('Missing username (needed for cue user field)'); + let position = ''; + if (opts.positionMode === 'player') { + // ✅ THIS is what “uses” lastPlayerPosition + const p = (this.lastPlayerPosition ?? '').trim(); + if (!p) + throw new Error('Current player position is not available yet'); + if (!this.isValidHmsMs(p)) + throw new Error(`Current player position is invalid: ${p}`); + position = this.normalizeHmsMs(p); + } + else { + const custom = (opts.customPosition ?? '').trim(); + if (!custom) + throw new Error('Custom position is required'); + if (!this.isValidHmsMs(custom)) + throw new Error('Custom position must be like HH:MM:SS or HH:MM:SS.mmm'); + position = this.normalizeHmsMs(custom); + } + await this.ensureAuthenticated(false); + if (!this.cookieHeader) + return; + const url = `https://central.resi.io/api_v2.svc/streamprofiles/${this.currentEventProfileId}/events/${this.currentEventId}/cues`; + const body = { position, name: cueName, privateCue: !!opts.privateCue, user }; + const res = await fetch(url, { + method: 'POST', + headers: { ...this.buildAuthHeaders(), 'Content-Type': 'application/json' }, + body: JSON.stringify(body), + }); + if (!res.ok) { + const text = await res.text().catch(() => ''); + throw new Error(`Add cue failed (${res.status}) ${text}`.trim()); + } + this.log('info', `Added cue "${cueName}" at ${position}`); + await this.refreshEventProfileAndCues(); + } + async deleteCueByName(opts) { + const query = (opts.name ?? '').trim(); + if (!query) + throw new Error('Cue name is required'); + if (!this.currentEventId || !this.currentEventProfileId) { + throw new Error('No active event loaded yet. Select a player/event first.'); + } + // Make sure we have current cues loaded + if (!this.cues || this.cues.length === 0) { + await this.refreshEventProfileAndCues(); + } + const norm = (s) => s.trim().toLowerCase(); + const qn = norm(query); + // Note: your this.cues is { uuid, name, positionMs } (no user field), + // so if you want onlyMine filtering, we need to store "user" too when loading cues. + // For now, onlyMine will be best-effort if you extend cues to include user. + const myUser = (this.config.username ?? '').trim().toLowerCase(); + // If you haven't extended cue storage with user, this will just skip that filter. + const cuesAny = this.cues; + const matches = cuesAny.filter((c) => { + const nameOk = opts.matchMode === 'contains' ? norm(c.name ?? '').includes(qn) : norm(c.name ?? '') === qn; + if (!nameOk) + return false; + if (opts.onlyMine) { + // works only if c.user exists + if (typeof c.user !== 'string') + return false; + return c.user.trim().toLowerCase() === myUser; + } + return true; + }); + if (matches.length === 0) { + throw new Error(`No cue matched "${query}"`); + } + const toDelete = opts.deleteMode === 'all' ? matches : [matches[0]]; + await this.ensureAuthenticated(false); + let deleted = 0; + for (const c of toDelete) { + const uuid = String(c.uuid ?? '').trim(); + if (!uuid) + continue; + const url = `https://central.resi.io/api_v2.svc/streamprofiles/${this.currentEventProfileId}/events/${this.currentEventId}/cues/${uuid}`; + const res = await fetch(url, { + method: 'DELETE', + headers: this.buildAuthHeaders(), + }); + if (!res.ok) { + const text = await res.text().catch(() => ''); + throw new Error(`Delete cue failed (${res.status}) ${text}`.trim()); + } + deleted++; + } + this.log('info', `Deleted ${deleted} cue(s) matching "${query}"`); + await this.refreshEventProfileAndCues(); + } + async destroy() { + if (this.pollTimer) + clearInterval(this.pollTimer); + if (this.playerPollTimer) + clearInterval(this.playerPollTimer); + this.playerPollTimer = undefined; + if (this.__tickTimer) + clearInterval(this.__tickTimer); + this.__tickTimer = undefined; + this.pollTimer = undefined; + this.log('debug', 'destroy'); + } +} +exports.ModuleInstance = ModuleInstance; +(0, base_1.runEntrypoint)(ModuleInstance, upgrades_js_1.UpgradeScripts); +//# sourceMappingURL=main.js.map \ No newline at end of file diff --git a/source/dist/presets.js b/source/dist/presets.js new file mode 100644 index 0000000..9ad9907 --- /dev/null +++ b/source/dist/presets.js @@ -0,0 +1,303 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.UpdatePresets = UpdatePresets; +const base_1 = require("@companion-module/base"); +function UpdatePresets(self) { + const presets = {}; + // Helper to reference THIS instance’s variables in button text + // Companion variable syntax uses the instance label. + const L = self.label; + // ---------------------------- + // STATUS / HEALTH + // ---------------------------- + presets['status_connected'] = { + type: 'button', + category: 'Resi • Status', + name: 'Connected (green) / Error (red)', + style: { + text: `Resi\n$(${L}:auth_status)`, + size: '14', + color: (0, base_1.combineRgb)(255, 255, 255), + bgcolor: (0, base_1.combineRgb)(40, 40, 40), + show_topbar: true, + }, + steps: [], + feedbacks: [ + { + feedbackId: 'resi_connected', + options: {}, + }, + { + feedbackId: 'resi_error', + options: {}, + }, + ], + }; + presets['status_player_active'] = { + type: 'button', + category: 'Resi • Status', + name: 'Player Active', + style: { + text: `Player\n$(${L}:current_position)`, + size: '14', + color: (0, base_1.combineRgb)(255, 255, 255), + bgcolor: (0, base_1.combineRgb)(40, 40, 40), + show_topbar: true, + }, + steps: [], + feedbacks: [ + { + feedbackId: 'player_active', + options: {}, + }, + ], + }; + presets['status_frozen'] = { + type: 'button', + category: 'Resi • Status', + name: 'Playback Frozen Warning', + style: { + text: `FROZEN?\n$(${L}:current_position)`, + size: '14', + color: (0, base_1.combineRgb)(255, 255, 255), + bgcolor: (0, base_1.combineRgb)(40, 40, 40), + show_topbar: true, + }, + steps: [], + feedbacks: [ + { + feedbackId: 'playback_frozen', + options: { + staleSeconds: 6, + }, + }, + ], + }; + // ---------------------------- + // CUE DISPLAY (NO ACTIONS) + // ---------------------------- + presets['cue_next_display'] = { + type: 'button', + category: 'Resi • Cues', + name: 'Next Cue Display', + style: { + text: `NEXT:\n$(${L}:next_cue_name)\nT- $(${L}:next_cue_time_in_hms)`, + size: '14', + color: (0, base_1.combineRgb)(255, 255, 255), + bgcolor: (0, base_1.combineRgb)(0, 0, 0), + show_topbar: false, + }, + steps: [], + feedbacks: [ + { + feedbackId: 'approaching_next_cue', + options: { threshold: 30 }, + }, + ], + }; + presets['cue_prev_display'] = { + type: 'button', + category: 'Resi • Cues', + name: 'Previous Cue Display', + style: { + text: `PREV:\n$(${L}:prev_cue_name)\n+ $(${L}:prev_cue_time_ago_in_hms)`, + size: '14', + color: (0, base_1.combineRgb)(255, 255, 255), + bgcolor: (0, base_1.combineRgb)(0, 0, 0), + show_topbar: false, + }, + steps: [], + feedbacks: [], + }; + // ---------------------------- + // MAINTENANCE / REFRESH + // ---------------------------- + presets['refresh_profile'] = { + type: 'button', + category: 'Resi • Maintenance', + name: 'Refresh Profile', + style: { + text: 'Refresh\nProfile', + size: '18', + color: (0, base_1.combineRgb)(255, 255, 255), + bgcolor: (0, base_1.combineRgb)(60, 60, 60), + show_topbar: false, + }, + steps: [ + { + down: [ + { + actionId: 'refresh_profile', + options: {}, + }, + ], + up: [], + }, + ], + feedbacks: [ + { feedbackId: 'resi_connected', options: {} }, + { feedbackId: 'resi_error', options: {} }, + ], + }; + presets['refresh_lists'] = { + type: 'button', + category: 'Resi • Maintenance', + name: 'Refresh Venues/Players', + style: { + text: 'Refresh\nLists', + size: '18', + color: (0, base_1.combineRgb)(255, 255, 255), + bgcolor: (0, base_1.combineRgb)(60, 60, 60), + show_topbar: false, + }, + steps: [ + { + down: [ + { + actionId: 'refresh_lists', + options: {}, + }, + ], + up: [], + }, + ], + feedbacks: [ + { feedbackId: 'resi_connected', options: {} }, + { feedbackId: 'resi_error', options: {} }, + ], + }; + // ---------------------------- + // CUE ACTIONS + // ---------------------------- + presets['add_cue_player'] = { + type: 'button', + category: 'Resi • Cues', + name: 'Add Cue @ Player Position', + style: { + text: 'Add Cue\n@ Player', + size: '18', + color: (0, base_1.combineRgb)(0, 0, 0), + bgcolor: (0, base_1.combineRgb)(180, 180, 180), + show_topbar: false, + }, + steps: [ + { + down: [ + { + actionId: 'add_cue_at_position', + options: { + name: 'Web Cue', + privateCue: false, + positionMode: 'player', + customPosition: '00:00:00.000', + }, + }, + ], + up: [], + }, + ], + feedbacks: [ + { feedbackId: 'resi_connected', options: {} }, + { feedbackId: 'resi_error', options: {} }, + ], + }; + presets['add_cue_custom'] = { + type: 'button', + category: 'Resi • Cues', + name: 'Add Cue @ Custom Time', + style: { + text: 'Add Cue\n@ Custom', + size: '18', + color: (0, base_1.combineRgb)(0, 0, 0), + bgcolor: (0, base_1.combineRgb)(180, 180, 180), + show_topbar: false, + }, + steps: [ + { + down: [ + { + actionId: 'add_cue_at_position', + options: { + // user can edit this preset, OR replace with a variable + name: 'Custom Cue', + privateCue: false, + positionMode: 'custom', + customPosition: '00:10:00.000', + }, + }, + ], + up: [], + }, + ], + feedbacks: [ + { feedbackId: 'resi_connected', options: {} }, + { feedbackId: 'resi_error', options: {} }, + ], + }; + presets['lookup_cue'] = { + type: 'button', + category: 'Resi • Cues', + name: 'Lookup Cue (stores in lookup_* vars)', + style: { + text: 'Lookup\nCue', + size: '18', + color: (0, base_1.combineRgb)(255, 255, 255), + bgcolor: (0, base_1.combineRgb)(0, 110, 200), + show_topbar: false, + }, + steps: [ + { + down: [ + { + actionId: 'lookup_cue_by_name', + options: { + // user edits this preset to their cue name or uses variables + cueName: 'sermon start', + matchMode: 'exact', + }, + }, + ], + up: [], + }, + ], + feedbacks: [ + { feedbackId: 'resi_connected', options: {} }, + { feedbackId: 'resi_error', options: {} }, + ], + }; + presets['delete_cue'] = { + type: 'button', + category: 'Resi • Cues', + name: 'Delete Cue by Name', + style: { + text: 'DELETE\nCue', + size: '18', + color: (0, base_1.combineRgb)(255, 255, 255), + bgcolor: (0, base_1.combineRgb)(140, 0, 0), + show_topbar: false, + }, + steps: [ + { + down: [ + { + actionId: 'delete_cue_by_name', + options: { + // user edits this preset to the cue they want to delete + cueName: 'Companion Test', + matchMode: 'exact', + deleteMode: 'first', + onlyMine: true, + }, + }, + ], + up: [], + }, + ], + feedbacks: [ + { feedbackId: 'resi_connected', options: {} }, + { feedbackId: 'resi_error', options: {} }, + ], + }; + self.setPresetDefinitions(presets); +} +//# sourceMappingURL=presets.js.map \ No newline at end of file diff --git a/source/dist/upgrades.js b/source/dist/upgrades.js new file mode 100644 index 0000000..7f01d4f --- /dev/null +++ b/source/dist/upgrades.js @@ -0,0 +1,5 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.UpgradeScripts = void 0; +exports.UpgradeScripts = []; +//# sourceMappingURL=upgrades.js.map \ No newline at end of file diff --git a/source/dist/variables.js b/source/dist/variables.js new file mode 100644 index 0000000..88a056f --- /dev/null +++ b/source/dist/variables.js @@ -0,0 +1,43 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.UpdateVariableDefinitions = UpdateVariableDefinitions; +function UpdateVariableDefinitions(instance) { + const vars = [ + { variableId: 'org_name', name: 'Organization name' }, + { variableId: 'first_name', name: 'First name' }, + { variableId: 'last_name', name: 'Last name' }, + { variableId: 'email', name: 'Email' }, + { variableId: 'auth_status', name: 'Auth status' }, + { variableId: 'last_error', name: 'Last error' }, + { variableId: 'last_poll', name: 'Last poll (local time)' }, + { variableId: 'current_position', name: 'Current position (HH:MM:SS.ms)' }, + { variableId: 'playback_state', name: 'Playback state (PLAYING/PAUSED)' }, + { variableId: 'position_update_interval_sec', name: 'Seconds between Resi position updates' }, + { variableId: 'player_fields', name: 'Fields Resi returns for this decoder (diagnostic)' }, + { variableId: 'current_position_sec', name: 'Current position (seconds)' }, + { variableId: 'current_event_id', name: 'Current event id (live from player)' }, + { variableId: 'cue_count', name: 'Cue count' }, + { variableId: 'cue_names', name: 'Cue names (comma separated)' }, + { variableId: 'event_id', name: 'Current event id (cues loaded for)' }, + { variableId: 'next_cue_name', name: 'Next cue name' }, + { variableId: 'next_cue_time_in_seconds', name: 'Seconds until next cue' }, + { variableId: 'next_cue_position', name: 'Next cue position (HH:MM:SS.ms)' }, + { variableId: 'next_cue_tod', name: 'Next cue time-of-day (24 hour)' }, + { variableId: 'prev_cue_name', name: 'Previous cue name' }, + { variableId: 'prev_cue_time_ago_in_seconds', name: 'Seconds since previous cue' }, + { variableId: 'prev_cue_position', name: 'Previous cue position (HH:MM:SS.ms)' }, + { variableId: 'prev_cue_tod', name: 'Previous cue time-of-day (24 hour)' }, + { variableId: 'next_cue_time_in_hms', name: 'Time until next cue (HH:MM:SS)' }, + { variableId: 'prev_cue_time_ago_in_hms', name: 'Time since previous cue (HH:MM:SS)' }, + { variableId: 'lookup_cue_query', name: 'Lookup cue query (name)' }, + { variableId: 'lookup_cue_found', name: 'Lookup cue found (true/false)' }, + { variableId: 'lookup_cue_name', name: 'Lookup cue name (matched)' }, + { variableId: 'lookup_cue_uuid', name: 'Lookup cue uuid' }, + { variableId: 'lookup_cue_position', name: 'Lookup cue position (HH:MM:SS.ms)' }, + { variableId: 'lookup_cue_position_sec', name: 'Lookup cue position (seconds)' }, + { variableId: 'lookup_cue_tod', name: 'Lookup cue time-of-day' }, + { variableId: 'playback_last_change_epoch_ms', name: 'Playback last position change (epoch ms)' }, + ]; + instance.setVariableDefinitions(vars); +} +//# sourceMappingURL=variables.js.map \ No newline at end of file diff --git a/source/manifest.json b/source/manifest.json new file mode 100644 index 0000000..590b6ed --- /dev/null +++ b/source/manifest.json @@ -0,0 +1,35 @@ +{ + "id": "resi-studio-cues", + "name": "resi-studio-cues", + "shortname": "resi-studio-cues", + "description": "Live cue list, playhead and next-cue countdown from Resi Studio", + "version": "0.1.4", + "license": "MIT", + "repository": "git+https://github.com/reykroona/companion-module-resi-studio-cues.git", + "bugs": "https://github.com/reykroona/companion-module-resi-studio-cues/issues", + "maintainers": [ + { + "name": "Rey Kroona", + "email": "reykroona@gmail.com" + } + ], + "runtime": { + "type": "node18", + "api": "nodejs-ipc", + "apiVersion": "1.14.1", + "entrypoint": "../dist/main.js" + }, + "legacyIds": [], + "manufacturer": "Rey Kroona", + "products": [ + "Resi Studio Cues" + ], + "keywords": [ + "resi", + "living as one", + "multisite", + "cues", + "countdown", + "decoder" + ] +} \ No newline at end of file diff --git a/source/npm_vendor.py b/source/npm_vendor.py new file mode 100644 index 0000000..c1b4a73 --- /dev/null +++ b/source/npm_vendor.py @@ -0,0 +1,105 @@ +#!/usr/bin/env python3 +"""Assemble a fully-nested node_modules tree from the npm registry, without npm. + +Fully nested (no hoisting) so Node's upward resolution can never pick a wrong +version: every package's deps live inside its own node_modules/. +""" +import json +import os +import shutil +import subprocess +import sys +import tarfile +import urllib.parse +import urllib.request + +CACHE = os.path.abspath("_npmcache") +os.makedirs(CACHE, exist_ok=True) +_meta = {} + + +def meta(name): + if name not in _meta: + path = os.path.join(CACHE, name.replace("/", "_") + ".json") + if not os.path.exists(path): + url = "https://registry.npmjs.org/" + urllib.parse.quote(name, safe="") + urllib.request.urlretrieve(url, path) + with open(path) as fh: + _meta[name] = json.load(fh) + return _meta[name] + + +def parse(v): + core = v.split("-")[0].split("+")[0] + return tuple(int(x) for x in core.split(".")) + + +def satisfies(version, rng): + if "-" in version: # never auto-pick a prerelease + return False + rng = rng.strip() + v = parse(version) + if rng in ("", "*", "latest", "x"): + return True + if rng.startswith("^"): + b = parse(rng[1:]) + if v < b: + return False + if b[0] > 0: + return v[0] == b[0] + if b[1] > 0: + return v[0] == 0 and v[1] == b[1] + return v[0] == 0 and v[1] == 0 and v[2] == b[2] + if rng.startswith("~"): + b = parse(rng[1:]) + return v >= b and v[0] == b[0] and v[1] == b[1] + if rng.startswith(">="): + return v >= parse(rng[2:]) + if rng[0].isdigit(): + return version == rng + raise ValueError("unsupported range %r" % rng) + + +def pick(name, rng): + m = meta(name) + ok = [v for v in m["versions"] if satisfies(v, rng)] + if not ok: + raise SystemExit("no version of %s satisfies %s" % (name, rng)) + best = max(ok, key=parse) + return best, m["versions"][best] + + +def install(name, rng, target_nm, chain, log): + version, info = pick(name, rng) + if (name, version) in chain: + return # already provided by an ancestor + dest = os.path.join(target_nm, *name.split("/")) + if os.path.exists(dest): + return + os.makedirs(os.path.dirname(dest), exist_ok=True) + tgz = os.path.join(CACHE, "%s-%s.tgz" % (name.replace("/", "_"), version)) + if not os.path.exists(tgz): + urllib.request.urlretrieve(info["dist"]["tarball"], tgz) + tmp = dest + ".tmp" + shutil.rmtree(tmp, ignore_errors=True) + with tarfile.open(tgz) as tf: + tf.extractall(tmp) + inner = os.path.join(tmp, "package") + shutil.move(inner if os.path.isdir(inner) else tmp, dest) + shutil.rmtree(tmp, ignore_errors=True) + log.append("%s%s@%s" % (" " * len(chain), name, version)) + + deps = info.get("dependencies") or {} + if deps: + child_nm = os.path.join(dest, "node_modules") + for dname, drng in sorted(deps.items()): + install(dname, drng, child_nm, chain | {(name, version)}, log) + + +if __name__ == "__main__": + root_nm, name, rng = sys.argv[1], sys.argv[2], sys.argv[3] + os.makedirs(root_nm, exist_ok=True) + log = [] + install(name, rng, root_nm, frozenset(), log) + print("\n".join(log)) + print("\n%d packages" % len(log)) diff --git a/source/resi_probe.py b/source/resi_probe.py new file mode 100644 index 0000000..60245fd --- /dev/null +++ b/source/resi_probe.py @@ -0,0 +1,243 @@ +#!/usr/bin/env python3 +""" +resi_probe.py — does the Resi cloud hand us live cue + playhead data for OUR account? + +One read-only pass over the endpoints a Companion "cue countdown" module would need: + + login POST /api/v3/login?newToken=true + who am i GET /api_v2.svc/users/me + venues GET /api/v3/customers/{customerId}/venues + decoders GET /api_v2.svc/users/{venueUuid}/players <- playhead lives here + event GET /api/v3/customers/{customerId}/events/{eventId} + cues GET /api_v2.svc/streamprofiles/{eventProfileId}/events/{eventId}/cues + +Nothing is created, changed or deleted. Your password is read with getpass (never +echoed), sent only to https://central.resi.io, and never written to disk. + +This talks to Resi's INTERNAL API — the one studio.resi.io itself uses. It is +undocumented and unsupported; don't open a Resi ticket about it. + +Usage: + python3 resi_probe.py --user you@yourchurch.org + python3 resi_probe.py --user you@yourchurch.org --watch 10 # 10s playhead watch + python3 resi_probe.py --user you@yourchurch.org --save ./resi-capture +""" + +import argparse +import getpass +import http.cookiejar +import json +import os +import ssl +import sys +import time +import urllib.error +import urllib.parse +import urllib.request + +BASE = "https://central.resi.io" + +_jar = http.cookiejar.CookieJar() +_opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(_jar)) +_token = None +_save_dir = None + + +def _cookie(name): + for c in _jar: + if c.name == name: + return c.value + return None + + +def _headers(): + h = {"Accept": "application/json", "User-Agent": "resi-probe/1.0"} + if _token: + h["Authorization"] = "X-Bearer " + _token + return h + + +def _request(method, path, body=None): + url = path if path.startswith("http") else BASE + path + data = None + h = _headers() + if body is not None: + data = json.dumps(body).encode() + h["Content-Type"] = "application/json" + req = urllib.request.Request(url, data=data, headers=h, method=method) + try: + with _opener.open(req, timeout=20) as resp: + raw = resp.read() + except urllib.error.HTTPError as e: + raise RuntimeError("HTTP %s on %s %s — %s" % (e.code, method, path, e.read()[:300].decode("utf-8", "replace"))) + except ssl.SSLError as e: + raise RuntimeError("TLS failure (%s). If this Mac's Python has no CA bundle, run the " + "'Install Certificates.command' that ships with your Python install." % e) + except urllib.error.URLError as e: + raise RuntimeError("Could not reach %s — %s" % (url, e.reason)) + if not raw: + return None + try: + return json.loads(raw) + except ValueError: + return raw.decode("utf-8", "replace") + + +def get(path): + out = _request("GET", path) + if _save_dir is not None: + name = urllib.parse.quote(path.split("?")[0].strip("/"), safe="") + ".json" + with open(os.path.join(_save_dir, name), "w") as fh: + json.dump(out, fh, indent=2, sort_keys=True) + return out + + +def login(username, password): + global _token + _request("POST", "/api/v3/login?newToken=true", {"userName": username, "password": password}) + _token = _cookie("livingas1") + if not _token: + raise RuntimeError("Login returned 2xx but set no 'livingas1' cookie — the auth shape has changed. " + "Cookies seen: %s" % ", ".join(c.name for c in _jar)) + + +def ms(position): + """'01:02:03.500' -> milliseconds. Returns None on anything unparseable.""" + if not position: + return None + try: + hh, mm_, rest = position.split(":") + return int((int(hh) * 3600 + int(mm_) * 60 + float(rest)) * 1000) + except (ValueError, AttributeError): + return None + + +def hms(milliseconds): + s, sign = int(abs(milliseconds) // 1000), "-" if milliseconds < 0 else "" + return "%s%02d:%02d:%02d" % (sign, s // 3600, (s % 3600) // 60, s % 60) + + +def main(): + global _save_dir + ap = argparse.ArgumentParser(description="Read-only probe of the Resi internal API.") + ap.add_argument("--user", help="Resi Studio login (email)") + ap.add_argument("--watch", type=int, default=0, metavar="SEC", + help="after the report, poll the playhead for SEC seconds to prove it advances") + ap.add_argument("--save", metavar="DIR", + help="write each raw JSON response to DIR (contains venue/decoder names and uuids)") + args = ap.parse_args() + + if args.save: + os.makedirs(args.save, exist_ok=True) + _save_dir = args.save + + username = args.user or input("Resi login (email): ").strip() + password = getpass.getpass("Password (not echoed, not stored): ") + + print("\n== auth ==") + login(username, password) + print(" login OK, bearer token acquired") + + me = get("/api_v2.svc/users/me") + customer_id = me.get("customerId") + print(" user : %s" % me.get("userName")) + print(" org : %s (customerId %s)" % (me.get("customerName"), customer_id)) + if not customer_id: + sys.exit(" no customerId on this account — stop here, nothing else will resolve") + + print("\n== venues ==") + venues = get("/api/v3/customers/%s/venues" % customer_id) or [] + if not venues: + print(" none returned. Either this login has no venue access, or the plan has no Multisite.") + for v in venues: + print(" %-40s %s" % (v.get("userName") or v.get("name"), v.get("uuid"))) + + print("\n== decoders / players ==") + live = [] + for v in venues: + players = [] + try: + players = get("/api_v2.svc/users/%s/players" % v.get("uuid")) or [] + except RuntimeError as e: + print(" [%s] players call failed: %s" % (v.get("userName"), e)) + continue + if not players: + print(" [%s] no players" % v.get("userName")) + for p in players: + print(" [%s] %-28s pos=%-14s eventId=%s" + % (v.get("userName"), p.get("userName"), p.get("position"), p.get("eventId"))) + extra = sorted(set(p) - {"playerHardwareId", "userName", "position", "eventId"}) + if extra: + print(" other fields on this player: %s" % ", ".join(extra)) + if p.get("eventId"): + live.append((v, p)) + + if not live: + print("\nNo decoder is on an event right now. Re-run this DURING a service —" + "\nposition and eventId are what the whole countdown hangs on.") + return + + for v, p in live: + print("\n== event + cues for %s / %s ==" % (v.get("userName"), p.get("userName"))) + event = get("/api/v3/customers/%s/events/%s" % (customer_id, p.get("eventId"))) + profile_id = event.get("eventProfileId") + print(" event : %s" % event.get("name")) + print(" startTime : %s" % event.get("startTime")) + print(" profileId : %s" % profile_id) + if not profile_id: + print(" no eventProfileId — cannot fetch cues for this event") + continue + + cues = get("/api_v2.svc/streamprofiles/%s/events/%s/cues?canISetCues=1" + % (profile_id, p.get("eventId"))) or [] + cues = sorted(cues, key=lambda c: ms(c.get("position")) or 0) + print(" %d cue(s):" % len(cues)) + here = ms(p.get("position")) + for c in cues: + at = ms(c.get("position")) + marker = " " + if here is not None and at is not None: + marker = "->" if at > here else " " + print(" %s %-14s %s" % (marker, c.get("position"), c.get("name"))) + + if here is None: + print("\n playhead unparseable (%r) — countdown not possible from this field" + % p.get("position")) + continue + nxt = next((c for c in cues if (ms(c.get("position")) or 0) > here), None) + print("\n THE BUTTON WOULD READ:") + print(" Playback position : %s" % hms(here)) + if nxt: + print(" Next cue : %s" % nxt.get("name")) + print(" Next cue in : %s" % hms((ms(nxt.get("position")) or 0) - here)) + else: + print(" Next cue : (none left on this event)") + + if args.watch: + v, p = live[0] + print("\n== watching %s for %ds (does the playhead advance?) ==" % (p.get("userName"), args.watch)) + first = last = None + deadline = time.time() + args.watch + while time.time() < deadline: + players = get("/api_v2.svc/users/%s/players" % v.get("uuid")) or [] + now = next((x.get("position") for x in players + if x.get("playerHardwareId") == p.get("playerHardwareId")), None) + print(" %s %s" % (time.strftime("%H:%M:%S"), now)) + if first is None: + first = ms(now) + last = ms(now) + time.sleep(2) + if first is not None and last is not None: + moved = last - first + print(" moved %s over ~%ds -> %s" + % (hms(moved), args.watch, + "PLAYING (a play/pause variable is derivable)" if moved > 0 else "frozen / paused")) + + +if __name__ == "__main__": + try: + main() + except RuntimeError as exc: + sys.exit("\nFAILED: %s" % exc) + except KeyboardInterrupt: + sys.exit("\ninterrupted") diff --git a/source/tick_test.js b/source/tick_test.js new file mode 100644 index 0000000..6f17f31 --- /dev/null +++ b/source/tick_test.js @@ -0,0 +1,272 @@ +// Drives the real pollPlayer() + estimator against a simulated Resi that +// publishes `position` on a coarse cadence, already slightly stale. + +var console = { + log: function () { print(Array.prototype.join.call(arguments, ' ')) }, + error: function () { print('ERR ' + Array.prototype.join.call(arguments, ' ')) }, + warn: function () { print('WARN ' + Array.prototype.join.call(arguments, ' ')) }, + info: function () { print(Array.prototype.join.call(arguments, ' ')) }, + debug: function () {}, +}; + +var failures = []; +function check(c, m) { if (!c) { failures.push(m); print(' FAIL ' + m) } } +function eq(g, w, m) { check(g === w, m + ' (got ' + g + ', want ' + w + ')') } +function near(g, w, tol, m) { + check(Math.abs(g - w) <= tol, m + ' (got ' + Math.round(g) + ', want ' + Math.round(w) + ' +/-' + tol + ')'); +} + +function StubInstanceBase() {} +StubInstanceBase.prototype.updateStatus = function () {} +StubInstanceBase.prototype.log = function () {} +StubInstanceBase.prototype.setVariableValues = function () {} +var stubs = { + '@companion-module/base': { + InstanceBase: StubInstanceBase, + InstanceStatus: { Ok: 'ok', Connecting: 'c', ConnectionFailure: 'f', BadConfig: 'b' }, + runEntrypoint: function () {}, combineRgb: function () { return 0 }, Regex: {}, + }, + './config.js': { GetConfigFields: function () { return [] } }, + './variables.js': { UpdateVariableDefinitions: function () {} }, + './upgrades.js': { UpgradeScripts: [] }, + './actions.js': { UpdateActions: function () {} }, + './feedbacks.js': { UpdateFeedbacks: function () {} }, + './presets.js': { UpdatePresets: function () {} }, +}; + +// ---- the simulated world ------------------------------------------------- +var fakeNow = 1700000000000; +Date.now = function () { return fakeNow }; + +// cadence / lag / jitter can be overridden: jsc tick_test.js -- 10000 3000 4000 +var ARGS = (typeof arguments !== 'undefined' ? arguments : []).map(Number); +var DIAG = true; +var RESI_CADENCE = ARGS[0] || 5000; // how often Resi refreshes `position` +var RESI_LAG = ARGS.length > 1 ? ARGS[1] : 500; // how stale it already is when it appears +var RESI_JITTER = ARGS[2] || 0; // how irregular the cadence is +var NET_JITTER = ARGS[3] || 0; // how variable the request/response round trip is +var START_INTO = ARGS[4] || 0; // how far into Resi's cycle the module starts polling +var seed = 12345; +function rnd() { seed = (seed * 1103515245 + 12345) & 0x7fffffff; return seed / 0x7fffffff } +var nextCadence = RESI_CADENCE; +var playing = true; +var trueMedia = 8 * 60000 + 48000; // where the decoder REALLY is +var published = trueMedia - RESI_LAG; // what the API currently returns +var lastPublish = fakeNow - START_INTO; +var extraPlayerFields = {}; +var TOL = RESI_LAG + 1200 + RESI_JITTER; + +function pad(n, w) { return String(n).padStart(w, '0') } +function fmt(ms) { + var t = Math.max(0, Math.floor(ms)); + return pad(Math.floor(t / 3600000), 2) + ':' + pad(Math.floor((t % 3600000) / 60000), 2) + ':' + + pad(Math.floor((t % 60000) / 1000), 2) + '.' + pad(t % 1000, 3); +} + +function advanceWorld(ms) { + for (var i = 0; i < ms; i += 100) { + fakeNow += 100; + if (playing) trueMedia += 100; + if (fakeNow - lastPublish >= nextCadence) { + lastPublish = fakeNow; + published = trueMedia - RESI_LAG; + nextCadence = RESI_CADENCE + Math.round((rnd() - 0.5) * 2 * RESI_JITTER); + if (nextCadence < 500) nextCadence = 500; + } + } +} + +var fetch = function () { + // the body is whatever Resi had at the moment the request left + var one = { playerHardwareId: 'DEC1', userName: 'Lobby', position: fmt(published), eventId: 'EV1' }; + for (var k in extraPlayerFields) one[k] = extraPlayerFields[k]; + // ...and the round trip takes a while, during which the world moves on + if (NET_JITTER) advanceWorld(100 + Math.round(rnd() * NET_JITTER)); + return Promise.resolve({ ok: true, json: function () { return Promise.resolve([one]) } }); +}; + +var tickFn = null, tickMs = null; +var setInterval = function (fn, ms) { tickFn = fn; tickMs = ms; return {} }; +var clearInterval = function () {}; + +var src = readFile(typeof TARGET !== 'undefined' ? TARGET : 'build/pkg/resi-studio-cues/dist/main.js'); +var mod = { exports: {} }; +(new Function('module', 'exports', 'require', 'setInterval', 'clearInterval', 'console', 'fetch', src))( + mod, mod.exports, + function (id) { if (!stubs[id]) throw new Error('unstubbed require: ' + id); return stubs[id] }, + setInterval, clearInterval, console, fetch); + +var inst = Object.create(mod.exports.ModuleInstance.prototype); +var vars = {}; +inst.setVariableValues = function (o) { for (var k in o) vars[k] = o[k] }; +inst.log = function () {}; +inst.config = {}; +inst.selectedVenueUuid = 'V1'; +inst.selectedPlayerHardwareId = 'DEC1'; +inst.cookieHeader = 'stub'; +inst.currentEventId = 'EV1'; +inst.playerPollInFlight = false; +inst.ensureAuthenticated = function () { return Promise.resolve() }; +inst.buildAuthHeaders = function () { return {} }; +inst.refreshCuesIfDue = function () { return Promise.resolve() }; +inst.cues = [ + { uuid: 'a', name: 'Welcome', positionMs: 5 * 60000 }, + { uuid: 'b', name: 'Campus Host', positionMs: 12 * 60000 + 30000 }, + { uuid: 'c', name: 'Message', positionMs: 41 * 60000 }, + { uuid: 'd', name: 'Closing', positionMs: 45 * 60000 }, +]; + +// true once Resi has actually REPORTED a position near `target` +function reported_near(target) { + return Number.isFinite(inst.__lastSampleMediaMs) && Math.abs(inst.__lastSampleMediaMs - target) < 8000; +} + +// one second of real operation: advance the world, poll, redraw +// any PAUSED while the decoder is really playing is a false pause: it freezes the countdown +var falsePauses = 0; +async function second() { + advanceWorld(1000); await inst.pollPlayer(); tickFn(); + if (playing && vars.playback_state === 'PAUSED') falsePauses++; +} +async function seconds(n) { for (var i = 0; i < n; i++) await second() } + +function timestampChecks() { + var now = Date.now(); + eq(inst.detectSampleTime({ lastUpdated: new Date(now - 2000).toISOString() }), now - 2000, + 'uses an ISO "lastUpdated" as the sample time'); + eq(inst.detectSampleTime({ reportedAt: now - 1500 }), now - 1500, + 'uses an epoch-ms "reportedAt" as the sample time'); + eq(inst.detectSampleTime({ startTime: new Date(now - 120000).toISOString() }), undefined, + 'ignores a timestamp too old to be this reading'); + eq(inst.detectSampleTime({ userName: 'Lobby', position: '00:01:02.000' }), undefined, + 'ignores fields that are not timestamps'); +} + +(async function () { + inst.startSmoothTick(); + eq(tickMs, 1000, 'display ticks every second'); + + // ---- accuracy while playing ----------------------------------------- + await seconds(40); + var err = trueMedia - inst.__lastEstMs; + check(err <= TOL + NET_JITTER * 0.35, 'estimate is not lagging (behind truth by ' + Math.round(err) + 'ms)'); + check(err >= -300, 'estimate does not run ahead of the real playhead (' + Math.round(err) + 'ms)'); + + // the point of the whole exercise: compare against the raw value over a + // full publish cycle, not at one lucky instant + var maxEstErr = 0, maxRawErr = 0; + for (var w = 0; w < 30; w++) { + await second(); + maxEstErr = Math.max(maxEstErr, trueMedia - inst.__lastEstMs); + maxRawErr = Math.max(maxRawErr, trueMedia - published); + } + if (RESI_CADENCE >= 2000) + check(maxRawErr >= RESI_CADENCE * 0.4, + 'sanity: the raw Resi value goes badly stale within a cycle (' + Math.round(maxRawErr) + 'ms)'); + check(maxEstErr <= TOL + NET_JITTER * 0.35, + 'the estimate stays close all cycle (worst ' + Math.round(maxEstErr) + 'ms vs raw ' + Math.round(maxRawErr) + 'ms)'); + + // ---- ticks every second, never backwards ------------------------------ + var prev = inst.__lastEstMs, stalls = 0, backwards = 0; + for (var i = 0; i < 60; i++) { + await second(); + if (inst.__lastEstMs === prev) stalls++; + if (inst.__lastEstMs < prev) backwards++; + prev = inst.__lastEstMs; + } + eq(stalls, 0, 'no stalled seconds across a minute of playback'); + eq(backwards, 0, 'the playhead never goes backwards'); + eq(vars.playback_state, 'PLAYING', 'reported as playing'); + check(trueMedia - inst.__lastEstMs <= TOL + NET_JITTER * 0.35, 'still accurate after a minute'); + + // ---- long run: the offset window is finite, so the best sample eventually + // ages out of it; that must not drag the displayed playhead backwards + var prev2 = inst.__lastEstMs, back2 = 0, worstBack = 0; + for (var L = 0; L < 200; L++) { + await second(); + if (inst.__lastEstMs < prev2) { + back2++; worstBack = Math.max(worstBack, prev2 - inst.__lastEstMs); + if (typeof DIAG !== 'undefined') + print(' backward step ' + Math.round(prev2 - inst.__lastEstMs) + 'ms at L=' + L + + ' state=' + vars.playback_state + ' offsets=' + (inst.__offsets || []).length + + ' sinceNew=' + (Date.now() - inst.__lastNewSampleAt) + ' base=' + inst.__baseOffset); + } + prev2 = inst.__lastEstMs; + } + eq(back2, 0, 'no backward steps over 200s (worst was ' + Math.round(worstBack) + 'ms)'); + eq(falsePauses, 0, 'never reported PAUSED while playing, startup included'); + + // ---- a fired cue / forward seek -------------------------------------- + inst.lastCueRefreshMs = 999999; + trueMedia = 40 * 60000 + 50000; // decoder jumps; Resi says nothing yet + var jumpAt = fakeNow, sawIt = false; + for (var q = 0; q < 60 && !sawIt; q++) { await second(); sawIt = reported_near(trueMedia) } + check(sawIt, 'the jump is picked up at all'); + var detectMs = fakeNow - jumpAt; + if (typeof DIAG !== 'undefined') print(' jump detected after ' + detectMs + 'ms'); + check(detectMs <= RESI_CADENCE + RESI_JITTER + 2000, + 'jump detected within one publish cycle (' + detectMs + 'ms)'); + eq(inst.lastCueRefreshMs, 0, 'a jump forces the cue list to refresh immediately'); + near(inst.__lastEstMs, trueMedia, TOL + RESI_CADENCE / 2, 'estimate resyncs to the new playhead at once'); + if (typeof DIAG !== 'undefined') print(' post-seek error: ' + Math.round(trueMedia - inst.__lastEstMs) + 'ms'); + check(trueMedia - inst.__lastEstMs >= -400, + 'estimate does not overshoot after a seek (' + Math.round(trueMedia - inst.__lastEstMs) + 'ms)'); + eq(vars.next_cue_name, 'Message', 'next cue is correct straight after the jump'); + + await seconds(15); + eq(vars.next_cue_name, 'Closing', 'rolled over after passing Message'); + eq(vars.prev_cue_name, 'Message', 'passed cue became prev'); + + // ---- a backwards seek ------------------------------------------------- + trueMedia = 6 * 60000; + for (var r = 0; r < 60 && !reported_near(trueMedia); r++) await second(); + near(inst.__lastEstMs, trueMedia, TOL + RESI_CADENCE / 2, 'follows a backwards seek'); + eq(vars.next_cue_name, 'Campus Host', 'cue targets recompute after seeking back'); + + // ---- pause ------------------------------------------------------------ + playing = false; + // how long the module can legitimately take to call it a pause, given this feed + var pauseWait = Math.ceil((Math.max(15000, Math.min(45000, (RESI_CADENCE + RESI_JITTER) * 2.5 + 6000)) + + RESI_CADENCE + RESI_JITTER + 6000) / 1000); + await seconds(pauseWait); + eq(vars.playback_state, 'PAUSED', 'detects a real pause'); + var held = inst.__lastEstMs; + await seconds(20); + eq(inst.__lastEstMs, held, 'paused playhead holds instead of running on'); + + // ---- resume ----------------------------------------------------------- + playing = true; + await seconds(25); + eq(vars.playback_state, 'PLAYING', 'recovers after resume'); + near(inst.__lastEstMs, trueMedia, TOL + 1500, 'estimate re-locks after resume'); + + // ---- operator-driven resync (beats waiting for Resi to republish) ---- + var beforeEst = inst.__lastEstMs; + eq(inst.resyncToCue('No Such Cue'), false, 'resync to an unknown cue is refused'); + eq(inst.__lastEstMs, beforeEst, 'a refused resync leaves the playhead alone'); + + inst.lastCueRefreshMs = 999999; + eq(inst.resyncToCue('Campus Host'), true, 'resync to a named cue succeeds'); + eq(inst.__lastEstMs, 12 * 60000 + 30000, 'playhead snaps to that cue immediately'); + eq(vars.next_cue_name, 'Message', 'next cue updates in the same instant'); + eq(inst.lastCueRefreshMs, 0, 'resync also forces a cue-list refresh'); + + eq(inst.resyncToNextCue(), true, 'resync to the next cue succeeds'); + eq(inst.__lastEstMs, 41 * 60000, 'playhead snaps to the following cue'); + + // a real sample after a resync must still be taken seriously + trueMedia = 30 * 60000; published = trueMedia - RESI_LAG; lastPublish = fakeNow; + await seconds(2); + for (var z = 0; z < 60 && !reported_near(trueMedia); z++) await second(); + near(inst.__lastEstMs, trueMedia, TOL + RESI_CADENCE / 2, 'a real reading overrides a resync'); + + timestampChecks(); + + var b = failures.length; + eq(vars.next_cue_name, 'Not A Real Cue', 'deliberate failure'); + if (failures.length !== b + 1) { print('HARNESS BROKEN'); throw new Error('harness') } + failures.pop(); + + if (failures.length) { print('\n' + failures.length + ' FAILED'); throw new Error('tests failed') } + print('\nall estimator tests passed [cadence ' + RESI_CADENCE + 'ms, lag ' + RESI_LAG + 'ms, jitter +/-' + RESI_JITTER + 'ms]'); +})(); diff --git a/test_end_to_end.py b/test_end_to_end.py new file mode 100644 index 0000000..c6219a4 --- /dev/null +++ b/test_end_to_end.py @@ -0,0 +1,151 @@ +#!/usr/bin/env python3 +"""End-to-end: the real script loop, a simulated Resi, and the REAL ProPresenter. + +Everything except the Resi network calls is the shipping code path — event handling, +cue refresh, the estimator, and the ProPresenter pushes. Runs on the wall clock for +~30 seconds, then puts ProPresenter back how it found it. + + python3 test_end_to_end.py http://10.1.14.225:1025 --touch-live-propresenter + +It TAKES OVER that ProPresenter's NextCue timer and stage message for ~30s (showing +"TEST Cue A/B"), so only run it when nothing is on stage, and stop the installed bridge +first -- two writers on one timer make this test fail and the stage flicker. +""" +import json +import sys +import threading +import time +import urllib.request + +import resi_to_propresenter as R + +if len(sys.argv) < 3 or sys.argv[2] != "--touch-live-propresenter": + raise SystemExit(__doc__) +PP = sys.argv[1] +TIMER = "NextCue" + +t0 = time.time() +START_MEDIA = 10 * 60000 # decoder starts 10 minutes into the event +CADENCE = 5.0 # Resi republishes every 5s +LAG = 0.6 # and each reading is 600ms stale +_published = [START_MEDIA - LAG * 1000, t0] + +CUES = [ + {"name": "TEST Cue A", "ms": START_MEDIA + 10_000}, + {"name": "TEST Cue B", "ms": START_MEDIA + 22_000}, +] + + +def true_media(): + return START_MEDIA + (time.time() - t0) * 1000 + + +def published(): + if time.time() - _published[1] >= CADENCE: + _published[0] = true_media() - LAG * 1000 + _published[1] = time.time() + return _published[0] + + +def fmt(ms): + ms = int(max(0, ms)) + return "%02d:%02d:%02d.%03d" % (ms // 3600000, (ms % 3600000) // 60000, + (ms % 60000) // 1000, ms % 1000) + + +class FakeResi: + def __init__(self, *a, **k): + self.customer_id = "CUST" + + def login(self): + R.log("FakeResi: signed in") + + def venues(self): + return [{"uuid": "V1", "userName": "Test Venue"}] + + def players(self, venue_uuid): + return [{"playerHardwareId": "DEC1", "userName": "Test Decoder", + "position": fmt(published()), "eventId": "EV1"}] + + def event(self, event_id): + return {"name": "SIMULATED EVENT", "eventProfileId": "P1"} + + def cues(self, profile_id, event_id): + return [dict(c) for c in CUES] + + +def pp_state(): + with urllib.request.urlopen(PP + "/v1/timers/current", timeout=8) as r: + timers = json.loads(r.read()) + mine = next((t for t in timers if t.get("id", {}).get("name") == TIMER), None) + try: + with urllib.request.urlopen(PP + "/v1/stage/message", timeout=8) as r: + msg = json.loads(r.read() or b'""') + except Exception: + msg = None + return mine, msg + + +def main(): + R.Resi = FakeResi + R.keychain_password = lambda account: "not-used" + cfg = dict(R.DEFAULTS) + cfg.update({"resi_user": "test@example.com", "player": "DEC1", "propresenter": PP, + "timer_name": TIMER, "poll_seconds": 1.0, "resync_seconds": 30}) + + before, _ = pp_state() + print("ProPresenter before: %s\n" % (before,)) + + t = threading.Thread(target=R.run, args=(cfg, False), daemon=True) + t.start() + + failures = [] + seen_a = seen_b = False + deadline = time.time() + 30 + while time.time() < deadline: + time.sleep(3) + timer, msg = pp_state() + remaining = None + if timer: + hh, mm, ss = (int(x) for x in timer["time"].split(":")) + remaining = hh * 3600 + mm * 60 + ss + print(" t+%-4.0fs decoder at %s PP timer %s (%s) message %r" + % (time.time() - t0, fmt(true_media()), + timer["time"] if timer else "?", timer["state"] if timer else "?", msg)) + if msg == "TEST Cue A": + seen_a = True + expected = (CUES[0]["ms"] - true_media()) / 1000.0 + if remaining is not None and expected > 1 and abs(remaining - expected) > 3: + failures.append("Cue A countdown off by %.1fs (PP said %ss, real %.1fs)" + % (remaining - expected, remaining, expected)) + if msg == "TEST Cue B": + seen_b = True + expected = (CUES[1]["ms"] - true_media()) / 1000.0 + if remaining is not None and expected > 1 and abs(remaining - expected) > 3: + failures.append("Cue B countdown off by %.1fs" % (remaining - expected)) + + if not seen_a: + failures.append("never armed for Cue A") + if not seen_b: + failures.append("never rolled over to Cue B") + + print("\ncleaning up...") + for path, method in (("/v1/timer/%s/stop" % TIMER, "GET"), + ("/v1/timer/%s/reset" % TIMER, "GET"), + ("/v1/stage/message", "DELETE")): + try: + urllib.request.urlopen( + urllib.request.Request(PP + path, method=method), timeout=8).close() + except Exception as e: + print(" cleanup %s failed: %s" % (path, e)) + + if failures: + print("\nFAILED:") + for f in failures: + print(" - %s" % f) + raise SystemExit(1) + print("\nend-to-end OK: armed for both cues, countdown matched the decoder") + + +if __name__ == "__main__": + main() diff --git a/test_playhead.py b/test_playhead.py new file mode 100644 index 0000000..8d24080 --- /dev/null +++ b/test_playhead.py @@ -0,0 +1,267 @@ +#!/usr/bin/env python3 +"""Drive resi_to_propresenter.Playhead against a simulated Resi on a fake clock. + +Mirrors the scenarios the JavaScript estimator was validated against, so the Python +port is held to the same standard rather than assumed correct. + + python3 test_playhead.py # the whole matrix + python3 test_playhead.py 7000 1000 4000 2000 # one profile +""" +import sys + +import resi_to_propresenter as R + +FAILURES = [] + + +def check(cond, msg): + if not cond: + FAILURES.append(msg) + print(" FAIL %s" % msg) + + +def eq(got, want, msg): + check(got == want, "%s (got %r, want %r)" % (msg, got, want)) + + +def near(got, want, tol, msg): + check(abs(got - want) <= tol, "%s (got %d, want %d +/-%d)" % (msg, got, want, tol)) + + +class World: + """A decoder playing at 1x, and a Resi that republishes its position on a coarse, + irregular cadence -- each reading already stale when it appears.""" + + def __init__(self, cadence, lag, jitter, net): + self.cadence, self.lag, self.jitter, self.net = cadence, lag, jitter, net + self.t = 1_700_000_000_000 + self.media = 8 * 60000 + 48000 + self.published = self.media - lag + self.last_publish = self.t + self.next_cadence = cadence + self.playing = True + self.seed = 12345 + + def rnd(self): + self.seed = (self.seed * 1103515245 + 12345) & 0x7FFFFFFF + return self.seed / 0x7FFFFFFF + + def advance(self, ms): + for _ in range(0, int(ms), 100): + self.t += 100 + if self.playing: + self.media += 100 + if self.t - self.last_publish >= self.next_cadence: + self.last_publish = self.t + self.published = self.media - self.lag + self.next_cadence = max(500, self.cadence + round((self.rnd() - 0.5) * 2 * self.jitter)) + + def fetch(self): + """What a poll sees, and the round trip it costs.""" + body = self.published + if self.net: + self.advance(100 + round(self.rnd() * self.net)) + return body + + +def run_profile(cadence, lag, jitter, net): + w = World(cadence, lag, jitter, net) + R.now_ms = lambda: w.t + head = R.Playhead() + tol = lag + 1200 + jitter + net * 0.35 + + def second(): + w.advance(1000) + head.note(w.fetch()) + return head.read() + + def seconds(n): + out = (None, False, 0) + for _ in range(n): + out = second() + return out + + cues = [ + {"name": "Welcome", "ms": 5 * 60000}, + {"name": "Campus Host", "ms": 12 * 60000 + 30000}, + {"name": "Message", "ms": 41 * 60000}, + {"name": "Closing", "ms": 45 * 60000}, + ] + + def next_cue(est): + return next((c for c in cues if c["ms"] > est), None) + + # ---- accuracy while playing -------------------------------------------- + est, playing, _ = seconds(40) + check(playing, "reported as playing") + err = w.media - est + check(err <= tol, "estimate is not lagging (behind by %dms)" % err) + check(err >= -300, "estimate does not run ahead (%dms)" % err) + + worst_est, worst_raw = 0, 0 + for _ in range(30): + est, _, _ = second() + worst_est = max(worst_est, w.media - est) + worst_raw = max(worst_raw, w.media - w.published) + if cadence >= 2000: + check(worst_raw >= cadence * 0.4, + "sanity: the raw Resi value really does go stale (%dms)" % worst_raw) + check(worst_est <= tol, + "the estimate stays close all cycle (worst %dms vs raw %dms)" % (worst_est, worst_raw)) + + # ---- never stalls, never runs backwards, over a long run ---------------- + prev, stalls, backwards = est, 0, 0 + for _ in range(200): + est, _, _ = second() + if est == prev: + stalls += 1 + if est < prev: + backwards += 1 + prev = est + eq(stalls, 0, "no stalled seconds over 200s") + eq(backwards, 0, "never goes backwards over 200s") + + # ---- a fired cue: the decoder jumps, Resi says nothing until it republishes + w.media = 40 * 60000 + 50000 + saw = False + for _ in range(60): + est, playing, _ = second() + if head.last_media is not None and abs(head.last_media - w.media) < 8000: + saw = True + break + check(saw, "the jump is picked up") + check(head.take_seek() or True, "seek flag is readable") + near(est, w.media, tol + cadence / 2, "estimate resyncs to the new playhead") + check(w.media - est >= -400, "no overshoot after a seek (%dms)" % (w.media - est)) + c = next_cue(est) + eq(c["name"] if c else None, "Message", "next cue is right after the jump") + + est, _, _ = seconds(15) + c = next_cue(est) + eq(c["name"] if c else None, "Closing", "rolled over after passing Message") + + # ---- a backwards seek --------------------------------------------------- + w.media = 6 * 60000 + for _ in range(60): + est, _, _ = second() + if head.last_media is not None and abs(head.last_media - w.media) < 8000: + break + near(est, w.media, tol + cadence / 2, "follows a backwards seek") + c = next_cue(est) + eq(c["name"] if c else None, "Campus Host", "cue target recomputes after seeking back") + + # ---- pause -------------------------------------------------------------- + w.playing = False + wait = int((max(15000, min(45000, (cadence + jitter) * 2.5 + 6000)) + cadence + jitter + 6000) / 1000) + est, playing, _ = seconds(wait) + check(not playing, "detects a real pause") + held = est + est, playing, _ = seconds(20) + eq(est, held, "paused playhead holds instead of running on") + + # ---- resume ------------------------------------------------------------- + w.playing = True + est, playing, _ = seconds(25) + check(playing, "recovers after resume") + near(est, w.media, tol + cadence, "re-locks after resume") + + # ---- a pause longer than the offset window, then resume ----------------- + w.playing = False + media_at_pause = w.media + est, playing, _ = seconds(150) + check(not playing, "still paused after 150s") + check(est is not None, "holds a position through a pause longer than the window") + # It keeps extrapolating until the pause is provable, then freezes. That overshoot is + # bounded by the pause-detection window -- it must not keep creeping for 150 seconds. + # The last in-flight reading can land a full cadence after playback actually stopped, + # and only then does the pause clock start -- so the bound is that plus the detection + # window plus a poll. What this pins is that it STOPS, rather than creeping for 150s. + pause_after = max(15000, min(45000, (cadence + jitter) * 2.5 + 6000)) + creep_bound = pause_after + cadence + jitter + 2 * net + 3000 + check(est - media_at_pause <= creep_bound, + "the frozen position stops creeping (%dms past where playback stopped, bound %dms)" + % (est - media_at_pause, creep_bound)) + w.playing = True + head.take_seek() + est, playing, _ = seconds(30) + check(playing, "recovers after a very long pause") + near(est, w.media, tol + cadence, "re-locks after a very long pause") + # Resuming is a discontinuity like any other: it has to be flagged, or the caller + # never knows to re-read the cue list at the moment playback restarts. + check(head.seeked or head.take_seek(), "a resume after a long pause is flagged as a seek") + + # ---- the harness must be able to fail ----------------------------------- + before = len(FAILURES) + eq(next_cue(est), "definitely not a cue", "deliberate failure") + if len(FAILURES) != before + 1: + raise SystemExit("HARNESS BROKEN: a false assertion passed") + FAILURES.pop() + + +def run_short_gaps_then_slow(start_into_cycle, burst): + """Seen live at North Attleboro: Resi publishing every ~30s, but the bridge started + a few seconds before a publish, so its first measured "gap" was 2s (and 9s after a + reboot). Once that was the learned cadence, every honest 30s gap was thrown out as a + pause gap, so playback was declared paused 15s into every update -- the timer + stopped and the next cue (and stage message) froze half the time.""" + w = World(30000, 1000, 2000, 500) + R.now_ms = lambda: w.t + w.advance(start_into_cycle) # the bridge starts partway through Resi's cycle + head = R.Playhead() + + def second(): + w.advance(1000) + head.note(w.fetch()) + return head.read() + + startup_paused = sum(1 for _ in range(100) if not second()[1]) + eq(startup_paused, 0, "not called paused while the cadence is still being learned") + if burst: + w.media += 15 * 60000 # a seek, published at once... + w.last_publish = w.t - w.next_cadence + second() + second() + w.last_publish = w.t - w.next_cadence # ...and again 2s later + second() + + paused = 0 + for _ in range(300): + _, playing, _ = second() + if not playing: + paused += 1 + eq(paused, 0, "short early gaps do not make every later 30s gap look like a pause") + + +def main(): + if len(sys.argv) > 1: + profiles = [tuple(int(x) for x in sys.argv[1:5])] + else: + profiles = [ + (5000, 500, 0, 0), (5000, 500, 0, 2500), (2000, 0, 0, 800), + (10000, 3000, 0, 2500), (7000, 1000, 4000, 2000), (3000, 500, 2000, 1000), + (12000, 2000, 6000, 3000), (1000, 0, 0, 0), (8000, 1500, 3000, 4000), + ] + bad = 0 + for cadence, lag, jitter, net in profiles: + start = len(FAILURES) + run_profile(cadence, lag, jitter, net) + n = len(FAILURES) - start + bad += n + print(" cadence=%-6s lag=%-5s jitter=%-5s net=%-5s %s" + % (cadence, lag, jitter, net, "OK" if n == 0 else "%d FAILED" % n)) + if len(sys.argv) == 1: + for label, into, burst in (("started 2s before a 30s publish", 28000, False), + ("started 9s before a 30s publish", 21000, False), + ("2s burst after a seek, 30s cadence", 0, True)): + start = len(FAILURES) + run_short_gaps_then_slow(into, burst) + n = len(FAILURES) - start + bad += n + print(" %-41s %s" % (label, "OK" if n == 0 else "%d FAILED" % n)) + if bad: + raise SystemExit("\n%d failure(s)" % bad) + print("\nall playhead tests passed across %d Resi profiles" % len(profiles)) + + +if __name__ == "__main__": + main() diff --git a/test_rate_limit.py b/test_rate_limit.py new file mode 100644 index 0000000..fbd3da1 --- /dev/null +++ b/test_rate_limit.py @@ -0,0 +1,105 @@ +#!/usr/bin/env python3 +"""When Resi says "too many requests" (429), the bridge must wait, not ask again next poll. + +Seen at North Attleboro: two tools polling one Resi account every second hit its rate +limit, and because neither backed off, Resi kept refusing and the ProPresenter +countdown stopped. Runs the real loop on a fake clock against a fake Resi; touches +nothing real. Takes a second. + + python3 test_rate_limit.py +""" +import io +import urllib.error + +import resi_to_propresenter as R + +clock = [0.0] +asks = [] +sleeps = [] + + +class Done(BaseException): + pass + + +def fake_sleep(s): + sleeps.append(s) + clock[0] += s + if clock[0] > 600: # ten simulated minutes is plenty + raise Done() + + +def too_many(): + return urllib.error.HTTPError("https://central.resi.io/x", 429, "Too Many Requests", + {"Retry-After": "Wed, 21 Oct 2026 07:28:00 GMT"}, io.BytesIO()) + + +class LimitedResi: + limited_until = 300 # Resi refuses for the first five minutes + + def __init__(self, *a, **k): + self.no_cache_bust = False + + def login(self): + pass + + def venues(self): + return [{"uuid": "V1"}] + + def players(self, venue_uuid): + asks.append(clock[0]) + if clock[0] < self.limited_until: + raise too_many() + return [{"playerHardwareId": "DEC1", "userName": "Test", "position": "00:10:00", + "eventId": None}] + + +class QuietPP: + def __init__(self, *a, **k): + pass + + def check(self): + pass + + def __getattr__(self, name): + return lambda *a, **k: True + + +def main(): + R.time = type("T", (), {"time": staticmethod(lambda: clock[0]), + "sleep": staticmethod(fake_sleep), + "strftime": staticmethod(lambda f: "00:00:00")}) + R.now_ms = lambda: clock[0] * 1000 + R.Resi = LimitedResi + R.ProPresenter = QuietPP + R.keychain_password = lambda account: "x" + R.find_player = lambda resi, wanted: ("V1", {"playerHardwareId": "DEC1", "userName": "Test"}) + R.log = lambda msg: None + cfg = dict(R.DEFAULTS) + cfg.update({"resi_user": "t@example.com", "player": "DEC1", "propresenter": "http://x"}) + try: + R.run(cfg, False) + except Done: + pass + + failures = [] + limited = [t for t in asks if t < LimitedResi.limited_until] + print("asked Resi %d times in the 5 rate-limited minutes (every poll would be %d)" + % (len(limited), int(LimitedResi.limited_until / cfg["poll_seconds"]))) + if len(limited) > 12: + failures.append("kept asking while rate-limited: %d times" % len(limited)) + after = [t for t in asks if t >= LimitedResi.limited_until] + if not after: + failures.append("never asked again once Resi would answer") + elif after[0] - LimitedResi.limited_until > 125: + failures.append("waited %.0fs too long to recover" % (after[0] - LimitedResi.limited_until)) + steady = [b - a for a, b in zip(after, after[1:])] + if steady and max(steady) > cfg["poll_seconds"] + 0.5: + failures.append("did not return to the normal poll once answered (gaps %s)" % steady[:5]) + if failures: + raise SystemExit("FAILED:\n - " + "\n - ".join(failures)) + print("rate limit tests passed") + + +if __name__ == "__main__": + main() diff --git a/test_stage_message.py b/test_stage_message.py new file mode 100644 index 0000000..709cf31 --- /dev/null +++ b/test_stage_message.py @@ -0,0 +1,162 @@ +#!/usr/bin/env python3 +"""The stage message must go up once per cue, not on every resync or pause/resume. + +ProPresenter re-shows (flashes) the stage message on every PUT, even with the same text. +The bridge used to re-send it every resync_seconds and on each play/pause flip, so a +stalling Resi feed made the stage message flash over and over. + +Runs the real loop against a FAKE ProPresenter on localhost -- the real one is never +touched. About 40 seconds. + + python3 test_stage_message.py +""" +import http.server +import json +import threading +import time + +import resi_to_propresenter as R + +CALLS = [] + + +class FakePP(http.server.BaseHTTPRequestHandler): + def _ok(self): + n = int(self.headers.get("Content-Length") or 0) + body = self.rfile.read(n) if n else b"" + CALLS.append((time.time(), self.command, self.path, body.decode())) + reply = b"" + if self.path == "/v1/timers": # the startup check looks for the timer by name + reply = json.dumps([{"id": {"name": "NextCue"}}]).encode() + self.send_response(200) + self.end_headers() + self.wfile.write(reply) + + do_GET = do_PUT = do_DELETE = _ok + + def log_message(self, *a): + pass + + +t0 = time.time() + + +def fmt(ms): + ms = int(max(0, ms)) + return "%02d:%02d:%02d.%03d" % (ms // 3600000, (ms % 3600000) // 60000, + (ms % 60000) // 1000, ms % 1000) + + +class FakeResi: + def __init__(self, *a, **k): + self.customer_id = "C" + + def login(self): + pass + + def venues(self): + return [{"uuid": "V1"}] + + def players(self, venue_uuid): + media = 10 * 60000 + int(time.time() - t0) * 1000 # moves every second + return [{"playerHardwareId": "DEC1", "userName": "Test", "position": fmt(media), + "eventId": "EV1"}] + + def event(self, event_id): + return {"name": "SIM", "eventProfileId": "P1"} + + def cues(self, profile_id, event_id): + return [{"name": "Message", "ms": 30 * 60000}] # one cue, far away + + +def run_for(seconds, stage_message, flap): + """Run the real loop; with flap, playback reads as paused/playing every 3s -- + what a stalling Resi feed looks like to the loop.""" + del CALLS[:] + server = http.server.ThreadingHTTPServer(("127.0.0.1", 0), FakePP) + threading.Thread(target=server.serve_forever, daemon=True).start() + + real_read = R.Playhead.read + + def flapping(self): + est, playing, cadence = real_read(self) + if flap and int(time.time() - t0) // 3 % 2: + return est, False, cadence + return est, playing, cadence + + R.Playhead.read = flapping + R.Resi = FakeResi + R.keychain_password = lambda account: "x" + cfg = dict(R.DEFAULTS) + cfg.update({"resi_user": "t@example.com", "player": "DEC1", + "propresenter": "http://127.0.0.1:%d" % server.server_address[1], + "timer_name": "NextCue", "poll_seconds": 0.5, "resync_seconds": 2, + "stage_message": stage_message}) + # The loop's only exit is an exception from its sleep; BaseException gets past its + # catch-all, so the end of the scenario stops it cleanly. + stop = threading.Event() + + class Done(BaseException): + pass + + def sleep(s): + if stop.wait(s): + raise Done() + + def worker(): + try: + R.run(cfg, False) + except Done: + pass + + R.time = type("T", (), {"time": staticmethod(time.time), "sleep": staticmethod(sleep), + "strftime": staticmethod(time.strftime)}) + th = threading.Thread(target=worker, daemon=True) + th.start() + time.sleep(seconds) + stop.set() + th.join(5) + R.time = time + R.Playhead.read = real_read + server.shutdown() + return list(CALLS) + + +def count(calls, method, path): + return sum(1 for c in calls if c[1] == method and c[2] == path) + + +def main(): + failures = [] + + calls = run_for(12, stage_message=True, flap=False) + arms = count(calls, "PUT", "/v1/timer/NextCue/start") + msgs = count(calls, "PUT", "/v1/stage/message") + print("steady play, resync every 2s: %d timer pushes, %d stage-message sends" % (arms, msgs)) + if arms < 4: + failures.append("sanity: the timer should have been resynced several times (%d)" % arms) + if msgs != 1: + failures.append("steady play sent the stage message %d times, want 1" % msgs) + + calls = run_for(16, stage_message=True, flap=True) + stops = count(calls, "GET", "/v1/timer/NextCue/stop") + msgs = count(calls, "PUT", "/v1/stage/message") + print("pause/resume every 3s: %d timer stops, %d stage-message sends" % (stops, msgs)) + if stops < 2: + failures.append("sanity: the flapping should have stopped the timer repeatedly (%d)" % stops) + if msgs != 1: + failures.append("pause/resume sent the stage message %d times, want 1" % msgs) + + calls = run_for(8, stage_message=False, flap=True) + touched = [c for c in calls if c[2] == "/v1/stage/message"] + print("stage_message off: %d stage-message calls" % len(touched)) + if touched: + failures.append("stage_message off still touched the stage message: %s" % touched) + + if failures: + raise SystemExit("\nFAILED:\n - " + "\n - ".join(failures)) + print("\nstage message tests passed") + + +if __name__ == "__main__": + main()