1
0

Refactor pipeline to call script entrypoints directly

This commit is contained in:
2026-04-03 16:15:19 +02:00
parent 74f8159eff
commit 008ee18ba8
8 changed files with 188 additions and 140 deletions

View File

@@ -6,16 +6,15 @@ from __future__ import annotations
import argparse
import logging
import os
import subprocess
import sys
from pathlib import Path
from typing import Callable
from src import concat_merged, generate_audios, generate_images, generate_script, generate_videos, merge_audio_video
from src.logging_config import configure_logging, debug_log_lifecycle
from src.s3_video_storage import S3VideoStorage
PROJECT_ROOT = Path(__file__).resolve().parent
SCRIPT_DIR = PROJECT_ROOT / "src"
DEFAULT_BASE_DIR = PROJECT_ROOT
DEFAULT_HUNYUAN_DIR = DEFAULT_BASE_DIR / "HunyuanVideo-1.5"
DEFAULT_REEL_SCRIPT = DEFAULT_BASE_DIR / "reel_script.json"
@@ -53,18 +52,17 @@ def parse_args() -> argparse.Namespace:
@debug_log_lifecycle
def run_step(name: str, cmd: list[str], cwd: Path | None = None) -> None:
def run_step(name: str, step: Callable[[], int]) -> None:
LOGGER.info("=== %s ===", name)
LOGGER.info("$ %s", " ".join(str(part) for part in cmd))
if cwd is not None:
LOGGER.info("(cwd: %s)", cwd)
subprocess.run(cmd, check=True, cwd=str(cwd) if cwd else None)
rc = step()
if rc != 0:
raise RuntimeError(f"Step '{name}' failed with exit code {rc}")
def _with_log_level(cmd: list[str], log_level: str | None) -> list[str]:
def _with_log_level(argv: list[str], log_level: str | None) -> list[str]:
if not log_level:
return cmd
return [*cmd, "--log-level", log_level]
return argv
return [*argv, "--log-level", log_level]
@debug_log_lifecycle
@@ -114,11 +112,17 @@ def main() -> int:
if not args.skip_generate and not args.reel_script.exists():
run_step(
"Generate Reel Script",
_with_log_level([
sys.executable,
str(SCRIPT_DIR / "generate_script.py"),
], args.log_level),
cwd=args.base_dir,
lambda: generate_script.main(
_with_log_level(
[
"--topic-description",
str(args.base_dir / "topic_description.txt"),
"--output-script",
str(args.reel_script),
],
args.log_level,
)
),
)
if not args.reel_script.exists():
LOGGER.error("Reel script was not generated at %s", args.reel_script)
@@ -127,48 +131,61 @@ def main() -> int:
if not args.skip_generate and not args.skip_audio_generate:
run_step(
"Generate Audios",
_with_log_level([
sys.executable,
str(SCRIPT_DIR / "generate_audios.py"),
], args.log_level),
cwd=args.base_dir,
lambda: generate_audios.main(
_with_log_level(
[
"--reel-script",
str(args.reel_script),
"--audios-dir",
str(args.audios_dir),
],
args.log_level,
)
),
)
if not args.skip_generate:
run_step(
"Generate Images",
_with_log_level([
sys.executable,
str(SCRIPT_DIR / "generate_images.py"),
], args.log_level),
cwd=args.base_dir,
lambda: generate_images.main(
_with_log_level(
[
"--reel-script",
str(args.reel_script),
"--images-dir",
str(args.images_dir),
],
args.log_level,
)
),
)
if not args.skip_generate:
run_step(
"Generate Videos",
_with_log_level([
sys.executable,
str(SCRIPT_DIR / "generate_videos.py"),
"--hunyuan-dir",
str(args.hunyuan_dir),
"--reel-script",
str(args.reel_script),
"--images-dir",
str(args.images_dir),
"--videos-dir",
str(args.videos_dir),
"--audios-dir",
str(args.audios_dir),
"--seed",
str(args.seed),
], args.log_level),
lambda: generate_videos.main(
_with_log_level(
[
"--hunyuan-dir",
str(args.hunyuan_dir),
"--reel-script",
str(args.reel_script),
"--images-dir",
str(args.images_dir),
"--videos-dir",
str(args.videos_dir),
"--audios-dir",
str(args.audios_dir),
"--seed",
str(args.seed),
],
args.log_level,
)
),
)
if not args.skip_merge:
merge_cmd = [
sys.executable,
str(SCRIPT_DIR / "merge_audio_video.py"),
merge_argv = [
"--videos-dir",
str(args.videos_dir),
"--audios-dir",
@@ -177,28 +194,31 @@ def main() -> int:
str(args.merged_dir),
]
if args.skip_audio_generate:
merge_cmd.append("--allow-missing-audio")
merge_argv.append("--allow-missing-audio")
run_step(
"Merge Audio + Video",
_with_log_level(merge_cmd, args.log_level),
lambda: merge_audio_video.main(_with_log_level(merge_argv, args.log_level)),
)
if not args.skip_concat:
run_step(
"Concatenate Merged Videos",
_with_log_level([
sys.executable,
str(SCRIPT_DIR / "concat_merged.py"),
"--merged-dir",
str(args.merged_dir),
"--output",
str(args.output),
], args.log_level),
lambda: concat_merged.main(
_with_log_level(
[
"--merged-dir",
str(args.merged_dir),
"--output",
str(args.output),
],
args.log_level,
)
),
)
except subprocess.CalledProcessError as exc:
LOGGER.exception("Pipeline failed at command: %s", exc.cmd)
return exc.returncode
except Exception:
LOGGER.exception("Pipeline failed")
return 1
if not args.skip_s3_upload:
try: