master
bel 2024-09-01 11:15:49 -06:00
parent e24af0a245
commit e27af38bd7
3 changed files with 121 additions and 0 deletions

Binary file not shown.

View File

@ -0,0 +1,57 @@
#! /bin/bash
disabled="false"
threshold="0.040"
vdir=/tmp/tmpfs
exec > >(tee "$vdir/backup.log") 2>&1
if ! [ -d "$vdir" ]; then
echo $vdir does not exist >&2
exit 1
fi
if ps aux | \
grep -v grep | \
grep -E 'services.backups.rclone|local.ffprobe'; then
echo skipping colliding run >&2
exit 0
fi
echo ok at 1
files=($(find $vdir -type f -name "*.m*"))
if [ "${#files[@]}" == "0" ]; then
echo no files found >&2
exit 0
fi
echo files=${files[@]}
includes=()
printf "reviewing"; printf " %s\n" "${files[@]}"
echo ok at 2
for file in "${files[@]}"; do
frames="$(
nice -n 19 /var/services/homes/squeaky2x3/ffmpeg-local/ffprobe \
-threads 1 -loglevel error -hide_banner -show_frames -of compact=p=0 \
-f lavfi "movie=$file,select=gt(scene\\,$threshold)" 2> /dev/null \
)"
ret=$?
if [ $ret -eq 0 ] && [ $(printf "%s\n" "$frames" | wc -l) -lt 2 ]; then
echo file has no movement $file >&2
rm -f "$file"
elif [ $ret -ne 0 ]; then
echo failed scanning $file >&2
files=("${files[@]/"$file"}")
else
echo file has movement $file
includes+=("$(basename "$file")")
fi
done
echo "pushing files ${includes[@]}"
if [ "${#includes[@]}" -gt 0 ]; then
if [ "$disabled" == "true" ] || \
/volume1/homes/squeaky2x3/services/backups/rclone \
--config /volume1/homes/squeaky2x3/services/backups/rclone.conf \
copy \
$vdir/ \
blapointe-drive:/projects/cctv/ut/ \
$(printf " --include %s" "${includes[@]}") ; then
rm -f "${files[@]}"
fi
fi
echo donezo
echo why

View File

@ -0,0 +1,64 @@
#! /bin/bash
main() {
local one_hour_ago_unix="$(($(date +%s) - 60 * 60))"
local one_hour_ago_ts="$(date -d @$one_hour_ago_unix -u +%Y-%m-%dT%H:%M:%SZ)"
for uuid in $(
api /api/ | jq -r .cameras[].uuid
); do
local stream=main
for recording in $(
api /api/cameras/$uuid/$stream/recordings \
| jq -c '.recordings[] | [.startId, .growing, .startTime90k]' \
| grep -v ,true, \
| jq -r .[0] \
| sort -n #-r
); do
api "/api/cameras/$uuid/$stream/view.mp4?s=$recording&ts=true" > /tmp/f.mp4
local ts="$(ffprobe /tmp/f.mp4 2>&1 | grep creation_time | tail -n 1 | awk '{print $NF}' | sed 's/\.000000Z/Z/')"
if [[ "$ts" > "$one_hour_ago_ts" ]]; then
echo "$ts > $one_hour_ago_ts, skipping"
continue
fi
echo uuid=$uuid stream=$stream recording=$recording ts=$ts
local fps=$(ffprobe -i /tmp/f.mp4 2>&1 | grep -o '[0-9]*\.*[0-9]* fps' | head -n 1 | awk '{print $1}')
local inspection="$(ffmpeg -i /tmp/f.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="$(echo "$threshold + 0.01" | bc)"
local max_flattened_score=$(echo "${flattened_scores[@]:5:${#flattened_scores[@]}-10}" | tr ' ' '\n' | sort -n | tail -n 1)
if ! [[ "${max_flattened_score#*.}" > "${threshold#*.}" ]]; then
echo nothing
fi
done
done
}
api() {
local path="$1"
shift
curl -sS "${CAMS_URL:-https://cams.inhome.blapointe.com}/${path#/}" "$@"
}
if [ "$0" == "$BASH_SOURCE" ]; then
main "$@"
fi