Skip to content

Instantly share code, notes, and snippets.

@vajonam
Last active October 17, 2023 14:13
Show Gist options
  • Save vajonam/b2697ce137781116707392f95891ddf1 to your computer and use it in GitHub Desktop.
Save vajonam/b2697ce137781116707392f95891ddf1 to your computer and use it in GitHub Desktop.
frigate_export.sh
#!/bin/bash
TMP_PATH=/tmp/work
# STORAGE_PATH="/net/sahara/Storage/Security/events"
# /net/security/frigate/recordings/2023-04-14/*/front/*.mp4
STORAGE_PATH="/net/security/frigate/recordings"
OUTPUT_PATH="/net/security/exports"
# list or of monitors with output fps.
MONITORS="front 30,doorbell 30,pathway 30,backdoor 30,patio 30"
FILES_TOKEEP=14
FFM_GLOBAL="-hide_banner -loglevel panic -y"
FFM_HW="-hwaccel cuda -hwaccel_output_format cuda -extra_hw_frames 8 -an -skip_frame nokey"
FFM_OPTS="-c:v h264_nvenc -cq:v 27"
URL=https://frigate.domain.com
# FFM_DEBUG="-v debug -y"
DOCKER_CMD='docker run --rm --gpus device=0 -v /net:/net:shared -v /tmp/work:/tmp/work --user www-data:www-data linuxserver/ffmpeg'
PROBE_CMD='docker run --rm --gpus device=0 -v /net:/net:shared -v /tmp/work:/tmp/work --user www-data:www-data --entrypoint=/usr/local/bin/ffprobe linuxserver/ffmpeg'
var=$1
if [ ! -z "$1" ] ; then
DATE=${1};
TODAY=`/bin/date -d "${DATE}+1 day" +"%Y%m%d"`
YESTERDAY=`date -d "${DATE}" +"%Y%m%d"`
else
TODAY=`/bin/date -d "today" +"%Y%m%d"`
DATE=`date -d "${TODAY}-1 day" +"%Y-%m-%d"`
YESTERDAY=`date -d "${TODAY}-1 day" +"%Y%m%d"`
fi
if [ ! -z ${TMP_PATH} ] ; then
mkdir -p ${TMP_PATH}
fi
start=$(date +%s -d"${YESTERDAY}")
end=$(date +%s -d"${TODAY}")
IFS=","
for k in ${MONITORS}
do
# Extract framerate and monitor name from tuple
IFS=" "
set -- $k
MONITOR=$1
FRAMERATE=$2
unset IFS
# Cleanup old files
FILENAME=${DATE}_${MONITOR}
echo -n "${MONITOR} on ${DATE} @ ${FRAMERATE}fps "
echo -n "probing,"
if DURATION=`${PROBE_CMD} ${FFM_DEBUG} -show_entries format=duration -v quiet -of csv='p=0' ${URL}/vod/${MONITOR}/start/$start/end/$end/index.m3u8` ; then
PTS=`echo "scale=4; 60/${DURATION}" | bc`
if (( $(echo "0.04 < ${PTS}" |bc -l) )); then
PTS=0.04
SPEEDUP=`echo "scale=1; 1/${PTS}" | bc`
else
SPEEDUP=`echo "scale=1; ${DURATION}/60" | bc`
fi
echo -n "encoding ${SPEEDUP}x"
$DOCKER_CMD ${FFM_GLOBAL} ${FFM_HW} -i ${URL}/vod/${MONITOR}/start/$start/end/$end/index.m3u8 ${FFM_OPTS} -vf setpts=${PTS}*PTS -r ${FRAMERATE} ${OUTPUT_PATH}/${MONITOR}/${FILENAME}.mp4
touch -d ${DATE} ${OUTPUT_PATH}/${MONITOR}/${FILENAME}.mp4
# ln -s /media/exports/${MONITOR}/${FILENAME}.mp4 ${OUTPUT_PATH}/../frigate/exports/${MONITOR}\ ${DATE}.mp4
else
echo -n "no events"
fi
echo ",done."
FILES=`ls -t1 ${OUTPUT_PATH}/${MONITOR}/*.mp4 | tail -n +$(($FILES_TOKEEP+1))`
if [ ! -z "$FILES" ] ; then
rm $FILES
echo "Removed old file $FILES"
fi
done;
# Clean up
docker ps -a | awk '{ print $1,$2 }' | grep ffmpeg | awk '{print $1 }' | xargs -I {} docker rm {} > /dev/null 2>&1
rm -f ${TMP_PATH}/*
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment