Files
sky-cam/capture.sh
T
Claude a1cf1304e4 Fix first-run blockers: MOVIES_DIR path, CAM_NAME, .env for Python, eval safety
daily_sunrise_video.sh: use \$MOVIES_DIR instead of \$BASE_DIR/movies so the
override in sky-cam.conf is respected when videos live on a separate drive.

capture.sh: default camera name falls back to \$SUNRISE_CAM (not the
undefined \$CAM_NAME) when no argument is passed.

sunrise2mm.py: also loads .env after sky-cam.conf so Mattermost credentials
moved to .env are actually visible to the upload script.

sunrise.py: raise a clear error message when LATITUDE/LONGITUDE/TIMEZONE
are missing from sky-cam.conf instead of an opaque KeyError.

4-seasons.sh, montage-mvt.sh: capture season_info.py output before eval so
a Python failure exits cleanly with a diagnostic message rather than
silently continuing with undefined variables.

bootstrap.sh: add system package install step (ffmpeg bc fonts-dejavu) and
show the .env setup step after install.sh generates .env.example.

README.md: correct Python package names and add fonts-dejavu dependency.

https://claude.ai/code/session_01C4jbd3waXG3eKZYbGUjLUQ
2026-04-19 23:37:10 +00:00

63 lines
1.9 KiB
Bash
Executable File

#!/bin/bash
# capture.sh <cam-name> — continuous JPEG frame capture from a camera's RTSP
# stream. Replaces MotionEye or any NVR for sky-cam's timelapse pipeline.
# Pure ffmpeg — no NVR software required.
#
# Run as a long-running systemd service (Type=simple), one per camera.
# install.sh generates sky-cam-capture-<cam>.service automatically when
# CAM_RTSP_<cam> is set in sky-cam.conf.
#
# Writes: BASE_DIR/<cam>/YYYY-MM-DD/HH-MM-SS.jpg
# Restarts ffmpeg at midnight so images land in the correct date directory.
# On camera disconnect, waits 30 s then reconnects automatically.
set -euo pipefail
SCRIPT_DIR="$(dirname "$(realpath "$0")")"
source "$SCRIPT_DIR/sky-cam.conf"
export TZ="$TIMEZONE"
CAM="${1:-$SUNRISE_CAM}"
rtsp_var="CAM_RTSP_${CAM}"
RTSP_URL="${!rtsp_var:-}"
if [ -z "$RTSP_URL" ]; then
echo "ERROR: CAM_RTSP_${CAM} not set in sky-cam.conf"
exit 1
fi
INTERVAL="${CAPTURE_INTERVAL:-10}"
echo "Starting capture: cam=$CAM interval=${INTERVAL}s"
while true; do
today=$(date +%Y-%m-%d)
dir="$BASE_DIR/$CAM/$today"
mkdir -p "$dir"
# Run until midnight + 5 s so the new day's directory is ready on restart
midnight=$(date -d "tomorrow 00:00:00" +%s)
now=$(date +%s)
duration=$(( midnight - now + 5 ))
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Capturing → $dir (rollover in ${duration}s)"
# -strftime 1 expands %H-%M-%S in the output path using the frame timestamp
ffmpeg -loglevel warning \
-rtsp_transport tcp \
-i "$RTSP_URL" \
-t "$duration" \
-vf "fps=1/${INTERVAL}" \
-f image2 \
-strftime 1 \
-q:v 2 \
"${dir}/%H-%M-%S.jpg" || true
# If ffmpeg exited before midnight the camera dropped — wait then retry
if [ "$(date +%s)" -lt "$midnight" ]; then
echo "[$(date '+%Y-%m-%d %H:%M:%S')] [$CAM] stream lost — retrying in 30s"
sleep 30
else
sleep 2 # brief pause at midnight before day rollover restart
fi
done