170 lines
5.6 KiB
Bash
Executable File
170 lines
5.6 KiB
Bash
Executable File
#!/bin/bash
|
|
# =============================================================================
|
|
# SURYA Epic Manim Render Script
|
|
# Renders all 14 tracks and combines with audio
|
|
# =============================================================================
|
|
|
|
set -e
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
cd "$SCRIPT_DIR"
|
|
|
|
AUDIO_DIR="$SCRIPT_DIR/audio"
|
|
OUTPUT_DIR="$SCRIPT_DIR/output"
|
|
MEDIA_DIR="$SCRIPT_DIR/media/videos/surya_epic/1080p60"
|
|
|
|
mkdir -p "$OUTPUT_DIR"
|
|
|
|
# Quality settings
|
|
QUALITY="-pqh --fps 60" # High quality 1080p60
|
|
# QUALITY="-pql --fps 30" # Low quality for testing
|
|
|
|
# Track classes in order
|
|
TRACKS=(
|
|
"Track01Skin:01_skin"
|
|
"Track02USavedMe:02_u_saved_me"
|
|
"Track03Nothing:03_nothing"
|
|
"Track04SweetRelief:04_sweet_relief"
|
|
"Track05Tiptoe:05_tiptoe"
|
|
"Track06NaturesCall:06_natures_call"
|
|
"Track07Dreamcatcher:07_dreamcatcher"
|
|
"Track08IDK:08_idk"
|
|
"Track09WithU:09_with_u"
|
|
"Track10PoorYou:10_poor_you"
|
|
"Track11Wait4U:11_wait_4_u"
|
|
"Track12RunToU:12_run_to_u"
|
|
"Track13Medications:13_medications"
|
|
"Track14Hollow:14_hollow"
|
|
)
|
|
|
|
echo "╔═══════════════════════════════════════════════════════════════╗"
|
|
echo "║ SURYA - Epic Manim Render Pipeline ║"
|
|
echo "╚═══════════════════════════════════════════════════════════════╝"
|
|
echo ""
|
|
|
|
# Function to render a single track
|
|
render_track() {
|
|
local track_info="$1"
|
|
local class_name="${track_info%%:*}"
|
|
local audio_name="${track_info##*:}"
|
|
|
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
echo "🎬 Rendering: $class_name"
|
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
|
|
# Render video
|
|
manim $QUALITY surya_epic.py "$class_name" 2>&1 | tail -20
|
|
|
|
# Find the rendered video
|
|
local video_file=$(find "$MEDIA_DIR" -name "${class_name}.mp4" 2>/dev/null | head -1)
|
|
|
|
if [ -f "$video_file" ]; then
|
|
echo "✓ Video rendered: $video_file"
|
|
|
|
# Combine with audio
|
|
local audio_file="$AUDIO_DIR/${audio_name}.mp3"
|
|
local output_file="$OUTPUT_DIR/${audio_name}_final.mp4"
|
|
|
|
if [ -f "$audio_file" ]; then
|
|
echo "🔊 Adding audio: $audio_file"
|
|
ffmpeg -y -i "$video_file" -i "$audio_file" \
|
|
-c:v copy -c:a aac -b:a 192k \
|
|
-shortest \
|
|
"$output_file" 2>/dev/null
|
|
echo "✓ Output: $output_file"
|
|
else
|
|
echo "⚠ Audio not found: $audio_file"
|
|
cp "$video_file" "$output_file"
|
|
fi
|
|
else
|
|
echo "✗ Video not found for $class_name"
|
|
fi
|
|
|
|
echo ""
|
|
}
|
|
|
|
# Parse arguments
|
|
if [ "$1" == "--single" ] && [ -n "$2" ]; then
|
|
# Render single track
|
|
for track in "${TRACKS[@]}"; do
|
|
if [[ "$track" == *"$2"* ]]; then
|
|
render_track "$track"
|
|
exit 0
|
|
fi
|
|
done
|
|
echo "Track not found: $2"
|
|
echo "Available tracks:"
|
|
for track in "${TRACKS[@]}"; do
|
|
echo " - ${track%%:*}"
|
|
done
|
|
exit 1
|
|
fi
|
|
|
|
if [ "$1" == "--list" ]; then
|
|
echo "Available tracks:"
|
|
for i in "${!TRACKS[@]}"; do
|
|
echo " $((i+1)). ${TRACKS[$i]%%:*}"
|
|
done
|
|
exit 0
|
|
fi
|
|
|
|
if [ "$1" == "--combine-only" ]; then
|
|
echo "Combining existing videos with audio..."
|
|
for track in "${TRACKS[@]}"; do
|
|
class_name="${track%%:*}"
|
|
audio_name="${track##*:}"
|
|
|
|
video_file=$(find "$MEDIA_DIR" -name "${class_name}.mp4" 2>/dev/null | head -1)
|
|
audio_file="$AUDIO_DIR/${audio_name}.mp3"
|
|
output_file="$OUTPUT_DIR/${audio_name}_final.mp4"
|
|
|
|
if [ -f "$video_file" ] && [ -f "$audio_file" ]; then
|
|
echo "🔊 Combining: $class_name"
|
|
ffmpeg -y -i "$video_file" -i "$audio_file" \
|
|
-c:v copy -c:a aac -b:a 192k \
|
|
-shortest \
|
|
"$output_file" 2>/dev/null
|
|
echo "✓ $output_file"
|
|
fi
|
|
done
|
|
exit 0
|
|
fi
|
|
|
|
if [ "$1" == "--concat" ]; then
|
|
echo "Creating full album video..."
|
|
|
|
# Create concat list
|
|
concat_file="$OUTPUT_DIR/concat_list.txt"
|
|
> "$concat_file"
|
|
|
|
for track in "${TRACKS[@]}"; do
|
|
audio_name="${track##*:}"
|
|
video_file="$OUTPUT_DIR/${audio_name}_final.mp4"
|
|
if [ -f "$video_file" ]; then
|
|
echo "file '$video_file'" >> "$concat_file"
|
|
fi
|
|
done
|
|
|
|
ffmpeg -y -f concat -safe 0 -i "$concat_file" \
|
|
-c copy \
|
|
"$OUTPUT_DIR/SURYA_Full_Album.mp4"
|
|
|
|
echo "✓ Full album: $OUTPUT_DIR/SURYA_Full_Album.mp4"
|
|
exit 0
|
|
fi
|
|
|
|
# Default: render all tracks
|
|
echo "Rendering all 14 tracks..."
|
|
echo ""
|
|
|
|
for track in "${TRACKS[@]}"; do
|
|
render_track "$track"
|
|
done
|
|
|
|
echo "═══════════════════════════════════════════════════════════════"
|
|
echo "✓ All tracks rendered!"
|
|
echo ""
|
|
echo "To create full album video, run:"
|
|
echo " ./render.sh --concat"
|
|
echo "═══════════════════════════════════════════════════════════════"
|