Files
sky-cam/year-end-join.sh
T
Claude 5d3ee97df0 All paths into sky-cam.conf; install.sh generates systemd units
sky-cam.conf
- Add SCRIPT_DIR (install location) and CAM_NAME (camera/folder name)
- These are the only values that change when deploying to a new machine

install.sh (new)
- Sources sky-cam.conf, generates all systemd .service and .timer units
  with correct ExecStart paths, then enables and starts the timers
- Run once after editing sky-cam.conf; run again if paths change
- Supports --system flag for system-wide install

All .sh scripts + sunrise2mm.py
- No hardcoded paths remain
- script_name=$(basename ...) derivation replaced by $CAM_NAME from conf
- sunrise_video.10s.sh now sources sky-cam.conf for BASE_DIR, CAM_NAME,
  and SCRIPT_DIR (replaces all /home/motion/... references)
- sunrise2mm.py builds video path from BASE_DIR + CAM_NAME in conf

systemd/ template files kept as reference but no longer need editing

https://claude.ai/code/session_01C4jbd3waXG3eKZYbGUjLUQ
2026-04-18 21:31:26 +00:00

77 lines
2.8 KiB
Bash
Executable File

#!/bin/bash
# year-end-join.sh — concatenate all 12 movement montages for one astronomical
# year into a single "Four Seasons" video.
#
# Called automatically by montage-mvt.sh after the last Autumn movement finishes.
# Can also be run manually: ./year-end-join.sh 2025
#
# The 12 individual movement videos already carry their own attribution overlay
# (first 6 seconds of each), so no extra card is appended here.
#
# Output: $BASE_DIR/movies/$CAM_NAME/$ASTRO_YEAR/$CAM_NAME-$ASTRO_YEAR.mp4
set -euo pipefail
SCRIPT_DIR="$(dirname "$(realpath "$0")")"
source "$SCRIPT_DIR/sky-cam.conf"
ASTRO_YEAR="${1:-}"
if [ -z "$ASTRO_YEAR" ]; then
echo "Usage: $0 <ASTRO_YEAR> (e.g. $0 2025)"
exit 1
fi
year_dir="$BASE_DIR/movies/$CAM_NAME/$ASTRO_YEAR"
echo "Assembling Four Seasons $ASTRO_YEAR from $year_dir ..."
# ── Collect the 12 montage files in season/movement order ────────────────────
concat_list=$(mktemp --suffix=.txt)
trap 'rm -f "$concat_list"' EXIT
missing=0
for season in Winter Spring Summer Autumn; do
for mvt in 1 2 3; do
mvt_dir="$year_dir/$season/Mvt$mvt/montage"
# Pick the newest (or only) montage file for this movement
f=$(find "$mvt_dir" -maxdepth 1 -name "*-Montage.mp4" 2>/dev/null | sort | tail -1)
if [ -z "$f" ]; then
echo "WARNING: missing montage for $season Mvt$mvt ($mvt_dir)"
missing=$((missing + 1))
else
echo " $season Mvt$mvt$(basename "$f")"
printf "file '%s'\n" "$f" >> "$concat_list"
fi
done
done
found=$(wc -l < "$concat_list")
echo "$found of 12 movements found ($missing missing)"
if [ "$found" -eq 0 ]; then
echo "ERROR: no montage files found — aborting."
exit 1
fi
if [ "$missing" -gt 0 ]; then
echo "WARNING: joining with $missing movement(s) absent."
fi
# ── Join ──────────────────────────────────────────────────────────────────────
output_file="$year_dir/${CAM_NAME}-${ASTRO_YEAR}.mp4"
echo "Output: $output_file"
ffmpeg -loglevel warning \
-f concat -safe 0 -i "$concat_list" \
-c copy -y "$output_file"
total_dur=$(ffprobe -v error -show_entries format=duration -of csv=p=0 "$output_file")
total_min=$(echo "scale=1; $total_dur / 60" | bc)
echo "Done: $output_file (${total_min} min)"
# ── Notify ────────────────────────────────────────────────────────────────────
"$SCRIPT_DIR/notify.sh" \
"Four Seasons $ASTRO_YEAR complete" \
"${CAM_NAME}-${ASTRO_YEAR}.mp4 — ${total_min} minutes ($found movements)" \
|| true