107 lines
3.1 KiB
Bash
107 lines
3.1 KiB
Bash
#! /bin/bash
|
|
|
|
set -eo pipefail
|
|
|
|
main() {
|
|
local nonrecent_unix="$(($(_date +%s) - 10 * 60))" # 10m ago
|
|
local nonrecent_ts="$(_date -d @$nonrecent_unix -u +%Y-%m-%d_%H-%M-%S)"
|
|
|
|
for recording in $(
|
|
api "/api/recording/query?recording-id=9999-12-28_23-59-59_x&limit=10000&reverse=false&include-data=false" \
|
|
| jq -r .[].id \
|
|
| sort
|
|
); do
|
|
if [[ "$recording" > "$nonrecent_ts" ]]; then
|
|
echo "$ts > $nonrecent_ts, so skipping"
|
|
continue
|
|
fi
|
|
|
|
if grep "^$recording$" ${SENTRYSHOT_DIR:-/tmp}/movement_detection_via_api_ffmpeg.sh.txt; then
|
|
continue
|
|
fi
|
|
|
|
echo recording=$recording >&2
|
|
api "/api/recording/video/$recording" > /tmp/movement_detection_via_api_ffmpeg.sh.mp4
|
|
|
|
local fps=$(_ffprobe -i /tmp/movement_detection_via_api_ffmpeg.sh.mp4 2>&1 | grep -o '[0-9]*\.*[0-9]* fps' | head -n 1 | awk '{print $1}')
|
|
local inspection="$(_ffmpeg -i /tmp/movement_detection_via_api_ffmpeg.sh.mp4 -vf 'select=not(mod(n\,'${fps%.*}')),select=gte(scene\,0),metadata=print:file=-' -an -f null - 2> /dev/null | paste - -)"
|
|
local scores=($(echo "$inspection" | awk '{print $NF}' | sed 's/.*=//'))
|
|
|
|
local flattened_scores=()
|
|
for i in $(seq 1 ${#scores[@]}); do
|
|
flattened_scores+=($(echo ${scores[@]:i-2:3} | tr ' ' '\n' | sort -n | head -n 2 | tail -n 1))
|
|
done
|
|
|
|
local threshold=1
|
|
local last_n=(${flattened_scores[@]:0:7})
|
|
for i in $(seq 1 ${#flattened_scores[@]}); do
|
|
last_n[$(( (i-1)%7 ))]=${flattened_scores[$((i-1))]}
|
|
max_of_last_n=$(echo "${last_n[@]}" | tr ' ' '\n' | sort | tail -n 1)
|
|
if [[ "$max_of_last_n" < "$threshold" ]]; then
|
|
threshold="$max_of_last_n"
|
|
fi
|
|
done
|
|
threshold="$(_perl -e "print $threshold + 0.005")"
|
|
|
|
local has_change=false
|
|
if [ "${#flattened_scores[@]}" -lt 10 ]; then
|
|
echo too short >&2
|
|
has_change=true
|
|
else
|
|
local max_flattened_score=$(echo "${flattened_scores[@]:5:${#flattened_scores[@]}-10}" | tr ' ' '\n' | sort -n | tail -n 1)
|
|
echo "${max_flattened_score#*.} > ${threshold#*.}"
|
|
if [[ "${max_flattened_score#*.}" > "${threshold#*.}" ]]; then
|
|
has_change=true
|
|
fi
|
|
fi
|
|
|
|
if $has_change; then
|
|
echo "$recording" >> ${SENTRYSHOT_DIR:-/tmp}/movement_detection_via_api_ffmpeg.sh.txt
|
|
else
|
|
echo no movement in "$recording"
|
|
api "/api/recording/delete/$recording" \
|
|
-X DELETE
|
|
fi
|
|
done
|
|
}
|
|
|
|
api() {
|
|
local path="$1"
|
|
shift
|
|
curl -sS "${CAMS_URL:-http://192.168.0.86:29898}/${path#/}" "$@"
|
|
}
|
|
|
|
_date() {
|
|
if which gdate &> /dev/null; then
|
|
gdate "$@"
|
|
else
|
|
date "$@"
|
|
fi
|
|
}
|
|
|
|
_perl() {
|
|
if which perl &> /dev/null; then
|
|
perl "$@"
|
|
else
|
|
/var/services/homes/squeaky2x3/.nix-profile/bin/perl "$@"
|
|
fi
|
|
}
|
|
|
|
_ffprobe() {
|
|
if which ffprobe &> /dev/null; then
|
|
ffprobe "$@"
|
|
else
|
|
/volume1/homes/squeaky2x3/ffmpeg-local/ffprobe "$@"
|
|
fi
|
|
}
|
|
|
|
_ffmpeg() {
|
|
if which ffmpeg &> /dev/null; then
|
|
ffmpeg "$@"
|
|
else
|
|
/volume1/homes/squeaky2x3/ffmpeg-local/ffmpeg "$@"
|
|
fi
|
|
}
|
|
|
|
main "$@"
|