← back to Govarbitrage
apps/mobile/device-proof-evidence/verify-recording.sh
45 lines
#!/bin/bash
# Validate a locally captured physical-device recording before any gated upload.
set -euo pipefail
FILE="${1:-}"
if [ -z "$FILE" ] || [ ! -f "$FILE" ]; then
echo "usage: $0 <recording.mov|recording.mp4>" >&2
exit 64
fi
case "${FILE##*.}" in
mov|MOV|mp4|MP4) ;;
*) echo "FAIL: expected .mov or .mp4" >&2; exit 65 ;;
esac
META="$(ffprobe -v error -select_streams v:0 \
-show_entries stream=codec_name,width,height -show_entries format=duration \
-of default=noprint_wrappers=1 "$FILE")"
WIDTH="$(printf '%s\n' "$META" | awk -F= '$1=="width"{print $2; exit}')"
HEIGHT="$(printf '%s\n' "$META" | awk -F= '$1=="height"{print $2; exit}')"
DURATION="$(printf '%s\n' "$META" | awk -F= '$1=="duration"{print $2; exit}')"
awk -v w="$WIDTH" -v h="$HEIGHT" -v d="$DURATION" 'BEGIN {
if ((w+0) < 1 || (h+0) < 1) exit 1;
if ((d+0) < 20) exit 2;
}' || {
rc=$?
[ "$rc" -eq 2 ] && echo "FAIL: recording must be at least 20 seconds" >&2
[ "$rc" -ne 2 ] && echo "FAIL: missing or invalid video dimensions" >&2
exit 66
}
BLACK_LOG="$(ffmpeg -hide_banner -v info -i "$FILE" -vf blackdetect=d=5:pix_th=0.10 \
-an -f null - 2>&1 || true)"
BLACK_DURATION="$(printf '%s\n' "$BLACK_LOG" | \
sed -n 's/.*black_duration:\([0-9.]*\).*/\1/p' | sort -nr | head -1)"
BLACK_DURATION="${BLACK_DURATION:-0}"
if awk -v black="$BLACK_DURATION" -v total="$DURATION" 'BEGIN { exit !(black >= total - 0.20) }'; then
echo "FAIL: recording appears entirely black" >&2
exit 67
fi
printf 'PASS: %sx%s, %ss\n' "$WIDTH" "$HEIGHT" "$DURATION"