Files
sky-cam/daily_sunrise_video.sh
T
Claude 6d68010691 Expose encoding quality and overlay durations in sky-cam.conf
Adds six CRF vars, AUDIO_BITRATE, and three MONTAGE_* overlay durations.
Values match previous hardcoded defaults so behavior is unchanged.

The same CRF appeared in several scripts but with intentionally different
values per purpose (28 for draft intermediates, 26 for polished output).
Each script's CRF is now its own variable in conf, so changing one never
silently changes another.

https://claude.ai/code/session_01C4jbd3waXG3eKZYbGUjLUQ
2026-04-19 16:08:14 +00:00

153 lines
5.1 KiB
Bash

#!/bin/bash
SCRIPT_DIR="$(dirname "$(realpath "$0")")"
source "$SCRIPT_DIR/sky-cam.conf"
# Get today's date in the format YYYY-MM-DD
current_date=$(date +%Y-%m-%d)
output_date=$(date +%Y-%m)
# Define the directory where images are stored (using today's date)
image_dir="$BASE_DIR/$CAM_NAME/$current_date"
# Set output directory
output_dir="$MOVIES_DIR/$CAM_NAME/$output_date/sunrise-only"
# Make sure the output directory exists
mkdir -p "$output_dir"
# Get the sunrise time for today using the sunrise.py script
sunrise_time=$(python3 "$SCRIPT_DIR/sunrise.py")
# Check if the sunrise time was fetched successfully
if [[ -z "$sunrise_time" ]]; then
echo "Error: Failed to retrieve sunrise time."
exit 1
fi
# Output the sunrise time in UTC
echo "Sunrise time (UTC): $sunrise_time"
# Export timezone so date and subprocesses use the configured local time.
export TZ="$TIMEZONE"
# Convert sunrise time from UTC to local time.
sunrise_time_et=$(TZ="$TIMEZONE" date -d "$sunrise_time" +"%H-%M-%S")
# Output the converted sunrise time in Eastern Time
echo "Sunrise time (Eastern Time): $sunrise_time_et"
# Function to convert time to seconds since midnight
time_to_seconds() {
IFS='-' read -r h m s <<< "$1"
echo $((10#$h * 3600 + 10#$m * 60 + 10#$s))
}
# Convert sunrise time (in Eastern Time) to seconds since midnight
sunrise_seconds=$(time_to_seconds "$sunrise_time_et")
# Calculate the capture window around sunrise.
start_seconds=$((sunrise_seconds - SUNRISE_PRE_MIN * 60))
end_seconds=$((sunrise_seconds + SUNRISE_POST_MIN * 60))
# Output the start and end times in seconds for debugging
echo "Start seconds: $start_seconds"
echo "End seconds: $end_seconds"
echo "Sunrise seconds: $sunrise_seconds"
# Check if the image directory exists
if [ ! -d "$image_dir" ]; then
echo "Error: The directory for images does not exist: $image_dir"
exit 1
fi
# Create a temporary file to store the list of image files
temp_file=$(mktemp)
# Find, sort, and process images in the specified directory
# Sort files by filename, which will order them correctly by MM-DD-SS
find "$image_dir" -type f -name "*.jpg" | sort -n | while read -r image; do
# Extract the time portion of the filename (e.g., 09-16-00 from 09-16-00.jpg)
image_time=$(basename "$image" .jpg) # MM-DD-SS
# Convert image time to seconds since midnight
image_seconds=$(time_to_seconds "$image_time")
# Debug: Output the image time and its seconds since midnight
echo "Image: $image, Time: $image_time, Seconds: $image_seconds"
# Check if the image time falls within the specified range
if [[ $image_seconds -ge $start_seconds && $image_seconds -le $end_seconds ]]; then
echo "Image $image_time ($image_seconds) is within the range [$start_seconds, $end_seconds]"
# Add the image to the temporary file
echo "file '$image'" >> "$temp_file"
fi
done
# Check if any images were found in the time range
if [ ! -s "$temp_file" ]; then
echo "No images found within the specified time range."
exit 1
fi
# Calculate the number of images
num_images=$(wc -l < "$temp_file")
echo "Total images to be included in the video: $num_images"
# Output video filename for the first movie (no speed adjustments)
first_movie="$output_dir/$current_date-sunrise-day.mp4"
# Create the first movie at the default frame rate (no speed adjustments)
echo "Creating video at default frame rate..."
ffmpeg -f concat -safe 0 -i "$temp_file" -c:v libx264 -pix_fmt yuv420p -crf "$CRF_SUNRISE" -vsync 2 -y "$first_movie"
# Check the duration of the created video
video_duration=$(ffmpeg -i "$first_movie" 2>&1 | grep "Duration" | cut -d ' ' -f 4 | sed s/,//)
echo "Initial video duration: $video_duration"
# Get the video duration in seconds (from HH:MM:SS format)
IFS=':' read -r hours minutes seconds <<< $(echo $video_duration | cut -d '.' -f1) # Extract time
total_seconds=$(($hours * 3600 + $minutes * 60 + $seconds)) # Convert to total seconds
target_duration=$SUNRISE_TARGET_SECS
speed_up_factor=$(echo "scale=3; $total_seconds / $target_duration" | bc)
echo "Calculated speed-up factor: $speed_up_factor"
# Output filename for the second movie (speed-adjusted)
final_video="$output_dir/$current_date-daily-sunrise.mp4"
# Apply the speed adjustment using the setpts filter
echo "Adjusting video speed to ${SUNRISE_TARGET_SECS}s..."
ffmpeg -i "$first_movie" -filter:v "setpts=PTS/$speed_up_factor" -y "$final_video"
# Check the duration of the adjusted video
adjusted_duration=$(ffmpeg -i "$final_video" 2>&1 | grep "Duration" | cut -d ' ' -f 4 | sed s/,//)
echo "Adjusted video duration: $adjusted_duration"
# Check for ffmpeg success
if [ $? -ne 0 ]; then
echo "Error: ffmpeg failed to create the final video."
exit 1
fi
# Inform user the video has been created
echo "Video created at $final_video"
# Clean up temporary files
rm "$temp_file"
# Run the sunrise_overlay.py script to add the sunrise overlay
python3 "$SCRIPT_DIR/sunrise_overlay.py" "$final_video"
# Run the sunrise2mm.py script to upload the video
python3 "$SCRIPT_DIR/sunrise2mm.py"
# Check if the Python script was successful
if [ $? -eq 0 ]; then
echo "Successfully uploaded the video to Mattermost."
else
echo "There was an issue uploading the video to Mattermost."
fi