feat(blacktv): 'stats' verb (load avg + instantaneous mpv decode %CPU)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Natalie 2026-06-07 20:49:47 -07:00
parent 71bed108a9
commit d7c3974669

View file

@ -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 <path>|play-show <q> [S] [E]|resume-show <q>|enqueue <x>|goto-ep N|releases|switch <rel>|pause|resume|toggle|vol N|seek S|next|prev|stop|status|watched [q]|ensure-display}" ;;
*) die "usage: black-tv {play <path>|play-show <q> [S] [E]|resume-show <q>|enqueue <x>|goto-ep N|releases|switch <rel>|pause|resume|toggle|vol N|seek S|next|prev|stop|status|stats|watched [q]|ensure-display}" ;;
esac