Files
wehub-resource-sync 7d6672c63e
Deploy Documentation / deploy (push) Failing after 1s
chore: import upstream snapshot with attribution
2026-07-13 12:19:20 +08:00

85 lines
2.5 KiB
Python

"""Persistence helpers for Web-only generation workflows."""
from __future__ import annotations
import subprocess
from datetime import datetime
from pathlib import Path
from typing import Any
from loguru import logger
def _probe_video_duration(video_path: str) -> float:
cmd = [
"ffprobe",
"-v",
"error",
"-show_entries",
"format=duration",
"-of",
"default=noprint_wrappers=1:nokey=1",
video_path,
]
try:
result = subprocess.run(cmd, capture_output=True, text=True, check=True)
return float(result.stdout.strip())
except Exception as exc:
logger.warning(f"Failed to probe video duration for {video_path}: {exc}")
return 0.0
async def save_web_generation_history(
pixelle_video: Any,
*,
task_id: str,
video_path: str,
pipeline: str,
input_params: dict,
title: str | None = None,
n_frames: int = 1,
) -> None:
"""Save a minimal history record for workflows implemented directly in Web UI."""
if not getattr(pixelle_video, "persistence", None):
logger.warning("Pixelle persistence service is not initialized; skipping history save")
return
path = Path(video_path)
if not task_id:
task_id = path.parent.name
if not path.exists():
logger.warning(f"Cannot save history; video file does not exist: {video_path}")
return
created_at = datetime.fromtimestamp(path.parent.stat().st_ctime).isoformat()
completed_at = datetime.fromtimestamp(path.stat().st_mtime).isoformat()
duration = _probe_video_duration(str(path))
normalized_input = dict(input_params)
normalized_input.setdefault("mode", pipeline)
normalized_input.setdefault("title", title or pipeline)
if title:
normalized_input["title"] = title
metadata = {
"task_id": task_id,
"created_at": created_at,
"completed_at": completed_at,
"status": "completed",
"input": normalized_input,
"result": {
"video_path": str(path),
"duration": duration,
"file_size": path.stat().st_size,
"n_frames": n_frames,
},
"config": {
"llm_model": pixelle_video.config.get("llm", {}).get("model", "unknown"),
"llm_base_url": pixelle_video.config.get("llm", {}).get("base_url", "unknown"),
"source": "web",
},
}
await pixelle_video.persistence.save_task_metadata(task_id, metadata)
logger.info(f"Saved web workflow history: {task_id}")