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
153 lines
5.1 KiB
Bash
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
|