forked from LiveCarta/ContentGeneration
Refactor pipeline to call script entrypoints directly
This commit is contained in:
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user