-
-
Save KennyStier/df149aefc7a6084acd926eca3e84acd9 to your computer and use it in GitHub Desktop.
#!/bin/bash | |
# Frigate Export Script | |
# By Kenny Stier (kstr.us) | |
# Based on https://github.com/blakeblackshear/frigate/issues/2369#issuecomment-1268359613 | |
# Menu taken from https://stackoverflow.com/a/28326129 | |
URL='http://192.168.0.14:5000' | |
OUTDIR='./archive' | |
mkdir -p $OUTDIR | |
# cams list from frigate api: | |
mycam=$(curl -s ${URL}/api/config |jshon -e cameras -k) | |
declare -a camarray=($mycam) | |
createmenu () | |
{ | |
select option; do # in "$@" is the default | |
if [ "$REPLY" -eq "$#" ]; | |
then | |
echo "Exiting..." | |
break; | |
elif [ 1 -le "$REPLY" ] && [ "$REPLY" -le $(($#-1)) ]; | |
then | |
echo "You selected $option" | |
break; | |
else | |
echo "Incorrect Input: Select a number 1-$#" | |
fi | |
done | |
} | |
echo "Choose your camera:" | |
createmenu "${camarray[@]}" | |
read -p "Enter start time (Format: Jan 1, 1980 16:20:00):" startstring | |
read -p "Enter end time (Format: Jan 1, 1980 18:30:00):" endstring | |
start=$(date +%s -d"${startstring}") | |
end=$(date +%s -d"${endstring}") | |
startname=$(date +%Y-%m-%d_%H-%M-%S -d"${startstring}") | |
ffmpeg -y -i ${URL}/vod/$option/start/$start/end/$end/index.m3u8 -c copy ${OUTDIR}/${option}-${startname}.mp4 |
@artlov Thanks for giving me something to start with!
Have tried to export large clips in the past to make timelapses with, this will make it much easier
Let me start this with two caveats; 1) I stole/used @KennyStier's script above, who based it on @artlov's . 2) I am not a designer and this doesn't look fancy at all. But, so far it is working and is easier than using a script for those who prefer the visual aspect.
Below are the two main files;
index.html: (camera names & descriptions need to be updated)
<!DOCTYPE html>
<html>
<head>
<title>Frigate Export</title>
<link rel="stylesheet" href="https://code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<style>
.ui-datepicker {
font-size: 0.8em;
}
</style>
</head>
<body>
<form method="post" action="frigate-export.php">
<label for="camera">Choose your camera:</label>
<select name="camera" id="camera">
<option value="camera1">Camera 1</option>
<option value="camera2">Camera 2</option>
<option value="camera3">Camera 3</option>
<option value="camera4">Camera 4</option>
<option value="camera5">Camera 5</option>
<option value="camera6">Camera 6</option>
<option value="camera7">Camera 7</option>
</select>
<br>
<label for="start">Start date and time:</label>
<input type="text" name="start" id="start" placeholder="Jan 1, 2023 16:20:00">
<br>
<label for="end">End date and time:</label>
<input type="text" name="end" id="end" placeholder="Jan 1, 2023 18:30:00">
<br>
<button type="submit">Export</button>
</form>
<?php if (!empty($filename)): ?>
<p>Generated file: <?php echo $filename; ?></p>
<?php endif; ?>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-ui-timepicker-addon/1.6.3/jquery-ui-timepicker-addon.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jquery-ui-timepicker-addon/1.6.3/jquery-ui-timepicker-addon.min.css">
<script>
$(document).ready(function() {
$("#start, #end").datetimepicker({
dateFormat: "M d, yy",
timeFormat: "HH:mm:ss",
showAnim: "slideDown",
changeYear: true,
yearRange: "-100:+0",
});
});
</script>
</body>
</html>
frigate-export.php: (server IP/port need to be updated)
<?php
$url = 'http://192.168.1.10:5000';
$outdir = './archive';
$filename = '';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$camera = $_POST['camera'];
$startstring = $_POST['start'];
$endstring = $_POST['end'];
if (!empty($camera) && !empty($startstring) && !empty($endstring)) {
$start = strtotime($startstring);
$end = strtotime($endstring);
$startname = date('Y-m-d_H-i-s', $start);
$command = "ffmpeg -y -i {$url}/vod/{$camera}/start/{$start}/end/{$end}/index.m3u8 -c copy {$outdir}/{$camera}-{$startname}.mp4";
exec($command, $output, $return_var);
if ($return_var === 0) {
$filename = "{$camera}-{$startname}.mp4";
$filepath = $outdir . '/' . $filename;
echo 'Export completed successfully. File: <a href="' . $filepath . '" target="_blank" rel="noopener noreferrer">' . $filename . '</a>';
} else {
echo 'Export failed.';
}
}
}
?>
Notes; I am running nginx in docker. The index.html & frigate-export.php files are in one of the web hosting files, I created a sub-folder called archive. This folder is where all the exported clips go into. You need to have ffmpeg installed and I also have the two attached files daterangepicker.css & daterangepicker.js due to the visual date selection.
Hopefully this makes sense and may be helpful for someone else...
Nice expantion of my basic script :)