From d7c397466957bf386a4c27c66eafd9db0debfefe Mon Sep 17 00:00:00 2001 From: Natalie Date: Sun, 7 Jun 2026 20:49:47 -0700 Subject: [PATCH] feat(blacktv): 'stats' verb (load avg + instantaneous mpv decode %CPU) Co-Authored-By: Claude Opus 4.8 --- src/blacktv/black-tv.sh | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/src/blacktv/black-tv.sh b/src/blacktv/black-tv.sh index 553b560..2addab6 100644 --- a/src/blacktv/black-tv.sh +++ b/src/blacktv/black-tv.sh @@ -211,6 +211,29 @@ status_json() { "$(getprop playlist-pos)" "$(getprop playlist-count)" } +# Host load: load averages + mpv's instantaneous %CPU (100 = one core). The +# decode cost is what changes with quality; computed from a 0.25s /proc delta so +# it's "right now", not the lifetime average ps reports. No sudo needed. +stats_json() { + local l1 l5 l15 cores pid mcpu="null" t1 t2 p1 p2 + read -r l1 l5 l15 _ < /proc/loadavg + cores=$(nproc 2>/dev/null || echo 1) + pid=$(pgrep -x mpv | head -1) + if [ -n "$pid" ] && [ -r "/proc/$pid/stat" ]; then + t1=$(awk '/^cpu /{s=0;for(i=2;i<=NF;i++)s+=$i;print s}' /proc/stat) + p1=$(awk '{print $14+$15}' "/proc/$pid/stat") + sleep 0.25 + t2=$(awk '/^cpu /{s=0;for(i=2;i<=NF;i++)s+=$i;print s}' /proc/stat) + p2=$(awk '{print $14+$15}' "/proc/$pid/stat" 2>/dev/null) + if [ -n "$t2" ] && [ -n "$p2" ] && [ "$t2" -gt "$t1" ]; then + mcpu=$(awk -v a="$p1" -v b="$p2" -v c="$t1" -v d="$t2" -v n="$cores" \ + 'BEGIN{printf "%.1f", 100.0*n*(b-a)/(d-c)}') + fi + fi + printf '{"load1":%s,"load5":%s,"load15":%s,"cores":%s,"mpv_cpu":%s}\n' \ + "$l1" "$l5" "$l15" "$cores" "$mcpu" +} + # --- dispatch --------------------------------------------------------------- cmd="${1:-}"; shift || true case "$cmd" in @@ -298,6 +321,7 @@ case "$cmd" in prev) ipc '{"command":["playlist-prev"]}' >/dev/null; echo prev ;; stop) sudo systemctl stop "$UNIT" 2>/dev/null || true; sudo pkill -x mpv 2>/dev/null || true; rm -f "$SOCK"; echo stopped ;; status) status_json ;; + stats) stats_json ;; ensure-display) ensure_display; echo "display ready: $(cat /sys/class/drm/card0-${CONNECTOR}/status 2>/dev/null)" ;; - *) die "usage: black-tv {play |play-show [S] [E]|resume-show |enqueue |goto-ep N|releases|switch |pause|resume|toggle|vol N|seek S|next|prev|stop|status|watched [q]|ensure-display}" ;; + *) die "usage: black-tv {play |play-show [S] [E]|resume-show |enqueue |goto-ep N|releases|switch |pause|resume|toggle|vol N|seek S|next|prev|stop|status|stats|watched [q]|ensure-display}" ;; esac