Refactor CLI and add preprocessing pipeline

- New CLI structure: -p project, -a action (required flags)
- Add -i import, -f force, -v verbose, --dry-run, --no-cache options
- Add preprocessor.py with chroma key filter (ProRes 4444 output)
- Support background images from shared_assets folder
- Support video metadata JSON files (talkinghead.json)
- Add validation for preprocessed output before render
- Update gnommo.sh with import command and new CLI interface
- Fix Python 3.9 compatibility (Optional[] instead of | None)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-12 15:45:19 +01:00
parent df900dfd59
commit 93fa820275
9 changed files with 763 additions and 287 deletions
+35 -38
View File
@@ -4,7 +4,9 @@
#
# Usage:
# gnommo.sh -p <project> Render project
# gnommo.sh -p <project> import Generate slides.json from image files
# gnommo.sh -p <project> validate Validate only
# gnommo.sh -p <project> preprocess Apply video preprocessing filters
# gnommo.sh -p <project> transcribe Transcribe video
# gnommo.sh -p <project> align Align markers to transcript
# gnommo.sh -p <project> all Full pipeline: transcribe → align → render
@@ -26,13 +28,16 @@ fi
PROJECT=""
COMMAND="render"
VERBOSE=""
FORCE=""
usage() {
echo "Usage: gnommo.sh -p <project> [command] [options]"
echo ""
echo "Commands:"
echo " render Render video (default)"
echo " import Generate slides.json from image files"
echo " validate Validate project only"
echo " preprocess Apply video preprocessing filters (chroma key, etc.)"
echo " transcribe Transcribe video audio"
echo " align Align manuscript to transcript"
echo " all Full pipeline: transcribe → align → render"
@@ -40,10 +45,13 @@ usage() {
echo "Options:"
echo " -p <dir> Project directory (required)"
echo " -v Verbose output"
echo " -f Force overwrite existing files"
echo " -h Show this help"
echo ""
echo "Examples:"
echo " gnommo.sh -p video1 # Render video1 project"
echo " gnommo.sh -p video1 import # Generate slides.json"
echo " gnommo.sh -p video1 import -f # Force overwrite slides.json"
echo " gnommo.sh -p video1 validate # Validate only"
echo " gnommo.sh -p video1 all # Full pipeline"
exit 0
@@ -56,13 +64,17 @@ while [[ $# -gt 0 ]]; do
shift 2
;;
-v|--verbose)
VERBOSE="--verbose"
VERBOSE="-v"
shift
;;
-f|--force)
FORCE="-f"
shift
;;
-h|--help)
usage
;;
validate|render|transcribe|align|all)
import|validate|render|preprocess|transcribe|align|all)
COMMAND="$1"
shift
;;
@@ -90,64 +102,49 @@ if [[ ! -f "$PROJECT/project.json" ]]; then
exit 1
fi
# Run commands
# Run commands using new CLI interface
run_gnommo() {
"$VENV_PYTHON" -m gnommo "$@"
"$VENV_PYTHON" -m gnommo -p "$PROJECT" -a "$1" $VERBOSE
}
run_gnommo_import() {
"$VENV_PYTHON" -m gnommo -p "$PROJECT" -a validate -i $FORCE $VERBOSE
}
case $COMMAND in
import)
echo "=== Importing assets for $PROJECT ==="
run_gnommo_import
;;
validate)
echo "=== Validating $PROJECT ==="
run_gnommo validate "$PROJECT"
run_gnommo validate
;;
transcribe)
echo "=== Transcribing $PROJECT ==="
VIDEO=$(find "$PROJECT/media" -name "*.mov" -o -name "*.mp4" | head -1)
if [[ -z "$VIDEO" ]]; then
echo "Error: No video file found in $PROJECT/media/"
exit 1
fi
run_gnommo transcribe "$VIDEO"
run_gnommo transcribe
;;
align)
echo "=== Aligning $PROJECT ==="
run_gnommo align "$PROJECT"
run_gnommo align
;;
render)
echo "=== Rendering $PROJECT ==="
run_gnommo render "$PROJECT" $VERBOSE
run_gnommo render
;;
preprocess)
echo "=== Preprocessing $PROJECT ==="
run_gnommo preprocess
;;
all)
echo "=== Full Pipeline: $PROJECT ==="
echo ""
# Step 1: Transcribe
echo ">>> Step 1/3: Transcribe"
VIDEO=$(find "$PROJECT/media" -name "*.mov" -o -name "*.mp4" | grep -v transcript | head -1)
if [[ -z "$VIDEO" ]]; then
echo "Error: No video file found in $PROJECT/media/"
exit 1
fi
TRANSCRIPT="${VIDEO%.*}.transcript.json"
if [[ -f "$TRANSCRIPT" ]]; then
echo " Transcript exists, skipping: $TRANSCRIPT"
else
run_gnommo transcribe "$VIDEO"
fi
echo ""
# Step 2: Align
echo ">>> Step 2/3: Align"
run_gnommo align "$PROJECT"
echo ""
# Step 3: Render
echo ">>> Step 3/3: Render"
run_gnommo render "$PROJECT" $VERBOSE
run_gnommo all
;;
*)