#!/usr/bin/env bash # scripts/manual/run_upstream_av_sync.sh # # Manual: capture the real Tethys webcam/mic endpoints while the shared-clock # sync probe streams upstream media through Lesavka, then analyze the skew. set -euo pipefail SCRIPT_DIR="$(cd -- "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)" REPO_ROOT="$(cd -- "${SCRIPT_DIR}/../.." >/dev/null 2>&1 && pwd)" TETHYS_HOST=${TETHYS_HOST:-tethys} LESAVKA_SERVER_ADDR=${LESAVKA_SERVER_ADDR:-http://38.28.125.112:50051} PROBE_DURATION_SECONDS=${PROBE_DURATION_SECONDS:-10} PROBE_WARMUP_SECONDS=${PROBE_WARMUP_SECONDS:-4} LEAD_IN_SECONDS=${LEAD_IN_SECONDS:-8} TAIL_SECONDS=${TAIL_SECONDS:-2} CAPTURE_SECONDS=${CAPTURE_SECONDS:-$((PROBE_DURATION_SECONDS + PROBE_WARMUP_SECONDS + LEAD_IN_SECONDS + TAIL_SECONDS))} REMOTE_CAPTURE=${REMOTE_CAPTURE:-/tmp/lesavka-upstream-av-sync.mkv} LOCAL_OUTPUT_DIR=${LOCAL_OUTPUT_DIR:-"${REPO_ROOT}/tmp"} VIDEO_SIZE=${VIDEO_SIZE:-1280x720} VIDEO_FPS=${VIDEO_FPS:-30} VIDEO_FORMAT=${VIDEO_FORMAT:-mjpeg} SSH_OPTS=${SSH_OPTS:-"-o BatchMode=yes -o ConnectTimeout=5"} mkdir -p "${LOCAL_OUTPUT_DIR}" STAMP="$(date +%Y%m%d-%H%M%S)" LOCAL_CAPTURE="${LOCAL_OUTPUT_DIR}/lesavka-upstream-av-sync-${STAMP}.mkv" echo "==> starting Tethys capture on ${TETHYS_HOST}" ssh ${SSH_OPTS} "${TETHYS_HOST}" bash -s -- \ "${REMOTE_CAPTURE}" \ "${CAPTURE_SECONDS}" \ "${VIDEO_SIZE}" \ "${VIDEO_FPS}" \ "${VIDEO_FORMAT}" <<'REMOTE_CAPTURE_SCRIPT' & set -euo pipefail remote_capture=$1 capture_seconds=$2 video_size=$3 video_fps=$4 video_format=$5 rm -f "${remote_capture}" video_args=(-f video4linux2 -framerate "${video_fps}" -video_size "${video_size}") if [[ -n "${video_format}" ]]; then video_args+=(-input_format "${video_format}") fi ffmpeg -hide_banner -loglevel error -y \ -thread_queue_size 1024 \ "${video_args[@]}" \ -i /dev/video0 \ -thread_queue_size 1024 \ -f alsa -ac 2 -ar 48000 \ -i hw:3,0 \ -t "${capture_seconds}" \ -c:v ffv1 -level 3 -g 1 \ -c:a pcm_s16le \ "${remote_capture}" REMOTE_CAPTURE_SCRIPT capture_pid=$! sleep "${LEAD_IN_SECONDS}" echo "==> running local Lesavka sync probe against ${LESAVKA_SERVER_ADDR}" probe_status=0 ( cd "${REPO_ROOT}" cargo run -p lesavka_client --bin lesavka-sync-probe -- \ --server "${LESAVKA_SERVER_ADDR}" \ --duration-seconds "${PROBE_DURATION_SECONDS}" \ --warmup-seconds "${PROBE_WARMUP_SECONDS}" ) || probe_status=$? capture_status=0 wait "${capture_pid}" || capture_status=$? if ssh ${SSH_OPTS} "${TETHYS_HOST}" "test -f '${REMOTE_CAPTURE}'"; then echo "==> fetching capture back to ${LOCAL_CAPTURE}" scp ${SSH_OPTS} "${TETHYS_HOST}:${REMOTE_CAPTURE}" "${LOCAL_CAPTURE}" fi if [[ "${probe_status}" -ne 0 ]]; then echo "sync probe failed with status ${probe_status}" >&2 [[ -f "${LOCAL_CAPTURE}" ]] && echo "partial capture preserved at ${LOCAL_CAPTURE}" >&2 exit "${probe_status}" fi if [[ "${capture_status}" -ne 0 ]]; then echo "Tethys capture failed with status ${capture_status}" >&2 [[ -f "${LOCAL_CAPTURE}" ]] && echo "partial capture preserved at ${LOCAL_CAPTURE}" >&2 exit "${capture_status}" fi echo "==> analyzing capture" ( cd "${REPO_ROOT}" cargo run -p lesavka_client --bin lesavka-sync-analyze -- "${LOCAL_CAPTURE}" ) echo "==> done" echo "capture: ${LOCAL_CAPTURE}"